[英]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.