在C ++中的链接列表中插入/删除任意位置

时间:2016-12-06 11:36:51

标签: c++ linked-list

我一直在学习C ++,最近才开始查看链接列表。我可以使用通常的函数insert / remove从后面/前面构造一个模板类List。现在我想出了一个练习,要求我编写一个函数来处理列表中任何位置的插入/删除。

请记住,我的问题非常基本。

我遇到的问题是我认为这个问题含糊不清。该功能需要什么样的信息?例如,为了删除,我可以提出几个候选人: 1)删除具有特定值的第一个节点(参数:value) 2)删除具有特定值的所有节点(参数:value) 3)删除特定节点(参数:指向该节点的指针) 1)和2)我可以轻松编码。 3)更难,但我也可以做到。我只是没有看到3)中的重点。使用列表时是否通常操作节点(列表定义之外)?对于使用列表的程序实际操作指向节点的指针通常是否正常?

"删除任何地方"的通常含义是什么?在这个环境中?

同样,对于"在任何地方插入",措辞很奇怪。什么,#34;任何地方"意思?链表中的位置应该由特定节点给出吗?

2 个答案:

答案 0 :(得分:1)

在链表中,您可以持续访问第一个元素。所以删除/插入任何地方意味着第一个和最后一个元素之间存在的位置。基本上你需要有2个迭代器。当您找到要删除/插入元素的位置时,应该引用它之前的对象。因为您无法访问prev元素,只能访问下一个元素: 让我们说我们的链表如下:
E0-> E1-> E2-> E3-> E4

如果你想删除E3,你需要在E2上设置迭代器,以便你可以纠正E2-> next的指针。

很好的参考资料是Nicolai M. Josuttis撰写的标准图书馆。你遇到的问题在那里被广泛描述。

答案 1 :(得分:0)

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;
}