我试图找出一个从链表中间删除的算法..
我的想法是遍历列表,在我要删除的节点之前找到节点,将其命名为Nprev,并将Nprev设置为Nnext,其中Nnext位于要删除Ndelete的节点之后。
所以Nprev -> Ndelte -> Nnext
。
我的问题是我无法弄清楚如何遍历此列表以在我想要的节点之前找到节点。
我一直在使用seg错误,因为我指定了超出范围的指针。 它是一个非常混乱的算法,我有许多if else语句..
有更简单的方法吗?
基本上我需要浏览列表,将函数应用于每个节点以测试是否 这是真是假。如果为false,我删除该节点。 删除第一个和最后一个并不困难,但中间难以理解。
如果有一些解决此问题的一般方法,请告诉我。我有 一直在网上搜索,发现我不需要的东西。
我用过这个:http://www.cs.bu.edu/teaching/c/linked-list/delete/
但是步骤4之前的算法只删除列表中的第一个节点 而且不再做了。 我该怎么修改呢?
他们也给出了一个递归的例子,但我不理解它,并被它吓倒了。
答案 0 :(得分:0)
首先,您需要找到中间节点。
好吧快速,慢速,前三个三分球
快速移动速度是slow的两倍,而prev存储缓慢的节点的地址。
即
*slow=&head,*fast=&head,prev=Null
遍历列表并在fast=NULL
时
如果元素的数量是奇数,则slow将指向中间节点,prev将存储中间节点之前的节点的地址。
这么简单
prev->next=slow->next
。
答案 1 :(得分:0)
这是我用来搜索和删除索引的一些例子:
鉴于此结构 :(也可以适应其他自引用结构)
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;
}