[英]Single Linked List - Delete From middle
我正在嘗試找出從鏈表中間刪除的算法。
我的想法是遍歷列表,在要刪除的節點之前找到該節點,將其稱為Nprev,並將Nprev設置為Nnext,其中Nnext在要刪除Ndelete的節點之后。
所以Nprev -> Ndelte -> Nnext
我的問題是我無法弄清楚如何遍歷此列表以在所需節點之前找到該節點。
我一直在使用seg錯誤執行此操作,因為我分配的指針超出了我假設的范圍。 我有一個非常混亂的算法,有很多if語句。
有沒有更簡單的方法可以做到這一點?
基本上,我需要遍歷該列表,將一個函數應用於每個節點以測試它是對還是錯。 如果為假,則刪除該節點。 刪除第一個和最后一個並不那么困難,但是中間讓我感到困惑。
請讓我知道是否有一些通用方法可以解決此問題。 我一直在搜尋互聯網,卻找不到我需要的東西。
我用了這個: http : //www.cs.bu.edu/teaching/c/linked-list/delete/
但是第4步之前的算法僅刪除列表中的第一個節點,並且不再執行任何操作。 我該如何修改?
他們還給出了一個遞歸示例,但我不理解它,並對它感到害怕。
首先,您需要找到中間節點。 好吧,以快,慢,以快於速度的兩倍的速度快速移動3個指針,並預先存儲慢速節點的地址。 即*slow=&head,*fast=&head,prev=Null
遍歷列表,當fast=NULL
時,如果元素數量為奇數,slow將指向中間節點,並且prev將存儲中間節點之前節點的地址。 因此只需prev->next=slow->next
。
這是我用來按索引搜索和刪除的示例:
給定此結構 :(也可以適用於其他自引用結構)
struct node
{
S s;
int num;
char string[10];
struct node *ptr;
};
typedef struct node NODE;
使用它從列表的“中間”某處刪除某項(按索引)
int remove_by_index(NODE **head, int n) /// tested, works
{
int i = 0;
int retval = -1;
NODE * current = *head;
NODE * temp_node = NULL;
if (n == 0) {
return pop(head);
}
for (int i = 0; i < n-1; i++) {
if (current->ptr == NULL) {
return -1;
}
current = current->ptr;
}
temp_node = current->ptr;
retval = temp_node->num;
current->ptr = temp_node->ptr;
free(temp_node);
return retval;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.