1. 程式人生 > >【劍指offer】18、刪除鏈表的(重復)節點

【劍指offer】18、刪除鏈表的(重復)節點

ica 這也 思路 遍歷 排序 時間 劍指offer 復雜度 例如

題目一

在O(1)時間內刪除鏈表節點,已知刪除節點的指針。

思路

關鍵是已知刪除節點的指針,則可以將下一個節點復制到當前節點,再將當前節點指向下下個節點。

這樣相當於用到的是 當前節點、下個節點、下下個節點,因此當前節點是尾節點時,下下個節點不存在,此時需要老老實實遍歷尋找。

時間復雜度 [(n-1)*O(1) + O(n)] / n = O(1)

代碼略。

題目二

在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後為 1->2->5

思路

思想很樸素,就雙指針不斷檢查。

唯一需要註意的是,頭指針也可能被刪除,因此設置一個dummy,這也是鏈表中經常用的trick

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode* dummy = new ListNode(-1);
        dummy->next = pHead;  //設置頭節點,防止頭節點被刪除
        ListNode* head = pHead, *pre = dummy, *pNext = nullptr;
        while (head  && head->next)
        {
            pNext 
= head->next; if (head->val == pNext->val) { while (head->val == pNext->val && pNext) //保證pNext存在,比如當重復直到尾節點時 { pNext = pNext->next; } pre->next = pNext; head
= pNext; } else{ pre = head; head = head->next; } } return dummy->next; } };

【劍指offer】18、刪除鏈表的(重復)節點