C 单链表-从中间删除
我正试图找出一种从链表中间删除的算法 我的想法是遍历列表,找到要删除的节点之前的节点,将其称为Nprev,并将Nprev设置为Nnext,其中Nnext位于要删除的节点Ndelete之后 所以C 单链表-从中间删除,c,list,hyperlink,C,List,Hyperlink,我正试图找出一种从链表中间删除的算法 我的想法是遍历列表,找到要删除的节点之前的节点,将其称为Nprev,并将Nprev设置为Nnext,其中Nnext位于要删除的节点Ndelete之后 所以Nprev->Ndelte->Nnext 我的问题是,我不知道如何遍历此列表以找到我想要的节点之前的节点 我一直在对seg故障执行此操作,因为我分配的指针超出了我假设的范围。 这是一个非常混乱的算法,我有很多if-else语句 有没有更简单的方法 基本上我需要遍历列表,对每个节点应用一个函数来测试 这是真是
Nprev->Ndelte->Nnext
我的问题是,我不知道如何遍历此列表以找到我想要的节点之前的节点
我一直在对seg故障执行此操作,因为我分配的指针超出了我假设的范围。
这是一个非常混乱的算法,我有很多if-else语句
有没有更简单的方法
基本上我需要遍历列表,对每个节点应用一个函数来测试
这是真是假。如果为false,则删除节点。
删除“第一个”和“最后一个”并没有那么难,但“中间”让我很难堪
请让我知道是否有一些通用的方法来解决这个问题。我已经
我一直在网上搜索,没有找到我需要的东西
我用了这个:
但是步骤4之前的算法只删除列表中的第一个节点
再也做不到了。
我如何修改这个
他们也给出了一个递归示例,但我不理解它,并且被它吓坏了。首先需要找到中间节点。 快,慢,上三分 以两倍于慢速的速度快速移动,并以慢速的前一个节点的地址存储prev。 即
*slow=&head,*fast=&head,prev=Null
遍历列表,并在fast=NULL
如果元素数为奇数,则slow将指向中间节点,prev将存储中间节点上一个节点的地址。
这么简单
prev->next=slow->next
这里是我用来按索引搜索和删除的示例:
给定此结构:(也可以调整为其他自引用结构)
使用此从列表“中间”的某个位置删除项目(按索引)
int-remove\u by\u索引(节点**head,int-n)///已测试,有效
{
int i=0;
int-retval=-1;
节点*当前=*头部;
NODE*temp_NODE=NULL;
如果(n==0){
返回弹孔(头部);
}
对于(int i=0;iptr==NULL){
返回-1;
}
当前=当前->ptr;
}
临时节点=当前->ptr;
retval=temp_node->num;
当前->ptr=临时节点->ptr;
空闲(临时节点);
返回返回;
}
我建议您在同一页上查看迭代示例。也许你会认为这更简单?
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;
}