劍指offer 刪除鍊錶中重複的結點

2021-10-02 14:11:21 字數 1305 閱讀 2410

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5。

這道題要注意讀題,是刪除重複結點,而不是去重。一開始,我迷糊了,完成的**是去重的,怎麼都不能通過,覺得很奇怪,看了討論區才意識到自己的錯誤。刪除重複結點就如題目給出的例子,因為 3 是重複結點,所以最後結果中 3 的結點被全部刪除;而去重是保留重複結點中的乙個,按照題目的例子,結果輸出是 1->2->3->4->5。

因為是刪除結點,第一反應是頭節點也可能被刪除,因此,我們需要新建乙個結點作為頭結點,以防止原頭結點要被刪除。

然後,我們建立兩個結點指標,分別是 pre 和 cur,pre指向當前確定的不重複結點,而 cur 指標的作用是遍歷,一直往後搜尋。

以題目中的例子為例,我們分析一下。首先,pre 指向新建的頭結點,而 cur 指向鍊錶的頭結點,也就是 1。判斷 cur 當前結點的值和其下乙個結點的值是否一樣,若不一樣則 pre 指向 cur,然後 cur 後移,即 pre 指向 1,cur 指向 2。再重複上述判斷,得到 pre 指向 2,cur 指向 3。此時,再對cur當前值和下乙個值進行判斷,發現兩個結點值一樣,也就是需要刪去,這個時候,迴圈判斷,找到最後乙個相同的結點,cur 指向最後乙個相同的結點,然後進行刪除操作,使 pre 的下乙個結點指向 cur 的下乙個結點,即 pre->next = cur->next,實現 pre 鍊錶中刪除了重複結點,cur 再指向下乙個結點。重複上述操作,直至 cur 為空。

實現**:

/*

struct listnode

};*/

class

solution

listnode* newhead =

newlistnode(-

1); newhead-

>next = phead;

// 在原煉表前加上新的頭節點

listnode* pre = newhead;

listnode* cur = newhead-

>next;

// cur 指向 phead

while

(cur!=null)

pre-

>next = cur-

>next;

cur = cur-

>next;

}else

}return newhead-

>next;}}

;

這道題還可以用遞迴演算法實現,具體實現方法可以看參考鏈結。

劍指offer 鍊錶 刪除鍊錶中的重複節點

題目在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 思路分析 思路一 使用linkedlist儲存不重複節點,重構鍊錶 分析評價 這個方法是乙個比較直接且容易想到的方法,使用時只要注意一些情況...

劍指offer 刪除鍊錶中重複的結點(鍊錶)

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 class solution listnode ans newlistnode 1 ans next phead listnode link a...

劍指Offer 鍊錶 刪除鍊錶中重複的結點

題目 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5。注意該鍊錶為排序鍊錶,重複的節點不保留哦!public class listnode 1 遞迴 遞迴的方法就像是先判斷第乙個節點和之後的節...