如何在不访问其父节点的情况下删除链表中的节点?
how to delete a node in a linked list without accessing its parent node?
我已经创建了一个包含 4 个节点的链表 t1 t2 t3 t4(按顺序),
这样
头=t1
t1->下一个=t2
t2->下一个=t3
t3->下一个=t4
t1->数据=1
t2->数据=2
t3->数据=3
我想删除t3,这样链表就只打印1 2.
但它正在打印 1 2 0 4.
此外,在检查后我发现 t2->next 不是 NULL,尽管 t3=t2->next 并且我已经删除了 t3。
那么,如何在不访问 t2 的情况下删除 t3?
#include<bits/stdc++.h>
using namespace std;
typedef struct linkedList
{
int data;
linkedList *next;
}node;
node* getNewNode()
{
node* nw=new node;
nw->next=NULL;
return nw;
}
void display(node* &start)
{
if(!start) return ;
node *temp=start;
while(temp)
{
cout<<temp->data<<" ";
temp=temp->next;
}
cout<<endl;
}
int main()
{
//create a linked list
node *head;
node*t1,*t2,*t3,*t4;
t1=new node;
t2=new node;
t3=new node;
t4=new node;
t1->data=1;
t2->data=2;
t3->data=3;
t4->data=4;
head=t1;
t1->next=t2;
t2->next=t3;
t3->next=t4;
//the linked list is 1 2 3 4
cout<<"the original linked list is ";
display(head);
//now, delete t3
delete t3;
t3=NULL;
//here, it is desired that the linked list prints 1 2
//but the linked list prints 1 2 0 4
cout<<"the linked list after deleting t3 is ";
display(head);
//I don't understand why t2->next is not null
//despite the fact that t2->next=t3
//and I have deleted t3
if(t2->next) cout<<endl<<"t2->next is not null"<<endl;
return 0;
}
无法在不访问 t2
的情况下删除 t3
,因为您的列表是 单独 linked。
如果你想删除 t3
和 t4
你应该这样做:
t2->next=NULL;
delete t3;
delete t4;
如果您只想删除列表中间某处的单个节点(例如t3
),您还必须调整 next
link 来自 t2
:
t2->next=t4;
delete t3;
否则指向删除的节点
你不能。除非您在其他地方显式存储指向 t3
的指针(这有点违背此列表的要点),否则指向 t3
的 仅 现有指针由 t2
。因此,要使用 t3
做 任何事情,您需要访问 t2
.
编辑:但除了这个小细节,这里可能是您想要的。
void deleteNth(node* start, int N)
{
node* prev = NULL, curr = start;
while (N-- > 0 && curr != NULL)
{
prev = curr;
curr = curr->next;
}
if (curr != NULL && N <= 0)
{
prev->next = curr->next;
delete curr;
}
}
N.B。从 1 而不是 0 开始计数 N
。
我已经创建了一个包含 4 个节点的链表 t1 t2 t3 t4(按顺序), 这样
头=t1
t1->下一个=t2
t2->下一个=t3
t3->下一个=t4
t1->数据=1
t2->数据=2
t3->数据=3
我想删除t3,这样链表就只打印1 2.
但它正在打印 1 2 0 4.
此外,在检查后我发现 t2->next 不是 NULL,尽管 t3=t2->next 并且我已经删除了 t3。
那么,如何在不访问 t2 的情况下删除 t3?
#include<bits/stdc++.h>
using namespace std;
typedef struct linkedList
{
int data;
linkedList *next;
}node;
node* getNewNode()
{
node* nw=new node;
nw->next=NULL;
return nw;
}
void display(node* &start)
{
if(!start) return ;
node *temp=start;
while(temp)
{
cout<<temp->data<<" ";
temp=temp->next;
}
cout<<endl;
}
int main()
{
//create a linked list
node *head;
node*t1,*t2,*t3,*t4;
t1=new node;
t2=new node;
t3=new node;
t4=new node;
t1->data=1;
t2->data=2;
t3->data=3;
t4->data=4;
head=t1;
t1->next=t2;
t2->next=t3;
t3->next=t4;
//the linked list is 1 2 3 4
cout<<"the original linked list is ";
display(head);
//now, delete t3
delete t3;
t3=NULL;
//here, it is desired that the linked list prints 1 2
//but the linked list prints 1 2 0 4
cout<<"the linked list after deleting t3 is ";
display(head);
//I don't understand why t2->next is not null
//despite the fact that t2->next=t3
//and I have deleted t3
if(t2->next) cout<<endl<<"t2->next is not null"<<endl;
return 0;
}
无法在不访问 t2
的情况下删除 t3
,因为您的列表是 单独 linked。
如果你想删除 t3
和 t4
你应该这样做:
t2->next=NULL;
delete t3;
delete t4;
如果您只想删除列表中间某处的单个节点(例如t3
),您还必须调整 next
link 来自 t2
:
t2->next=t4;
delete t3;
否则指向删除的节点
你不能。除非您在其他地方显式存储指向 t3
的指针(这有点违背此列表的要点),否则指向 t3
的 仅 现有指针由 t2
。因此,要使用 t3
做 任何事情,您需要访问 t2
.
编辑:但除了这个小细节,这里可能是您想要的。
void deleteNth(node* start, int N)
{
node* prev = NULL, curr = start;
while (N-- > 0 && curr != NULL)
{
prev = curr;
curr = curr->next;
}
if (curr != NULL && N <= 0)
{
prev->next = curr->next;
delete curr;
}
}
N.B。从 1 而不是 0 开始计数 N
。