[英]Insert/Delete Anywhere in a Linked List in C++
我学习C ++已有一段时间了,最近才开始查看链接列表。 我可以使用从后/前插入/删除常用功能构造一个模板类List。 现在我想出了一个练习,要求我编写一个函数来处理列表中任何位置的插入/删除。
请记住,我的问题是非常基本的。
我的问题是我认为这个问题模棱两可。 该功能需要什么样的信息? 例如,对于删除,我可以提出几个候选对象:1)删除具有特定值(参数:值)的第一个节点2)删除具有特定值(参数:值)的所有节点3)删除特定节点(参数:指向该节点的指针)1)和2)我可以轻松编写代码。 3)比较难,但我也可以做到。 我只是看不到3)中的要点。 使用列表时,通常会操纵节点(在列表定义之外)吗? 像这样,使用列表的程序通常实际操作指向节点的指针吗?
在此设置中“删除任何地方”的通常含义是什么?
同样,对于“在任何地方插入”,措辞很奇怪。 “任何地方”是什么意思? 链表中的位置是否应该由特定节点指定?
在链接列表中,您可以恒定时间访问第一个元素。 因此,在任何地方删除/插入都意味着第一个元素与最后一个元素之间存在的位置。 基本上,您需要有2个迭代器。 当找到要删除/插入元素的位置时,应在该对象之前引用该对象。 因为您无权访问prev元素,而只能访问下一个元素:假设我们的链接列表如下所示:
E0-> E1-> E2-> E3-> E4
如果要删除E3,则需要在E2上设置迭代器,以便可以更正E2-> next的指针。
很好的参考书是Nicolai M. Josuttis撰写的Standard Library一书。 您所遇到的问题在此处得到了广泛描述。
node*insert(node*head,int d){
node*temp=new node;
temp->data=d;
if(head==NULL){
temp->next=NULL;
head=temp;}
else
{node*curr=head,*pre=NULL;
while (curr!=NULL && curr->data<temp->data)
{
pre=curr;
curr=curr->next;
}
temp->next=curr;
if(pre==NULL)
head=temp;
pre->next=temp;
}
return head;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.