刪除鍊錶的節點
struct listnode
};void deletenode(listnode** plisthead,listnode* ptobedelete)
if(ptobedelete->next!=nullptr)//要刪除的節點不是尾節點
else //要刪除的節點為尾節點
p->next=nullptr;
delete ptobedelete;
ptobedelete=nullptr;
}}
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5
解題思路:
採用三個指標來進行遍歷,同時刪除重複的節點,因為是有序的鍊錶,我們就可以確定,重複的元素肯定是在一塊鏈結,所以我們就可以,用三指標,我們這裡就叫
pre、cur、nex 分別代表的是前中後三個指標,我們在考慮的情況中,如果頭節點開始就重複,我們就處理很起來多了一種情況就需要額外處理,所以我們新增乙個頭節點,變成帶頭節點,保證了頭節點開始不會重複,那麼我們就可以開是讓pre指向帶頭的節點,cur指向pre的next,nex指向cur的next。
接下來我們就可以看cur是否和nex相等,相等就讓nex繼續向下走,不相等然後再處理刪除,cur開始到nex中間節點都是要刪除的(包含cur指向,不包含nex指向)刪除,就用到了pre,刪除完成讓pre指向cur就可以了。
如果cur值與nex值不相等,那麼就可以三個指標各自往前移動乙個。
這題是要考慮**的完整性的,我們要盡可能多的考慮各種情況的輸入:
1)傳null
2)只有乙個節點
3)頭節點開始就有重複
4)中間節點重複
5)尾部節點重複
6)鍊錶中沒有重複鍊錶
7)所有節點都是重複的
解題**:
/*
struct listnode
};*/
class solution
// 如果沒有重複的那麼cur的next一定等於nex
if (cur->next != nex) // 如果相等說明沒有相同的節點
if (nex != null) // 這裡一定要要注意,要防止走到null發生段錯誤
nex = nex->next;
}else
}listnode* head = dummy->next; // 釋放空間,防止記憶體洩漏
delete dummy;
return head;
}};
劍指offer 面試題18 刪除鍊錶的節點
給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o 1 時間內刪除該節點。鍊錶節點與函式的定義如下 public static class listnode 將要刪除節點的next節點直接複製到該節點上。刪除原先的next節點 public void deletenode listnode hea...
面試題18 劍指offer 刪除鍊錶的節點
題目一 在o 1 時間刪除鍊錶結點。給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。思路 由於單向鍊錶只有next指標,要刪除給定節點必須要知道它的上乙個節點,通常會從頭遍歷複雜度為o n 不滿足題目,可以將給定節點的下乙個節點的值賦值給給定節點,然後刪除給定節點的下乙個節...
劍指offer 面試題18 刪除鍊錶的節點
給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。注意 此題對比原題有改動 示例 1 輸入 head 4,5,1,9 val 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 1 9.示例 2 輸入...