【劍指offer】18、刪除鏈表的(重復)節點
阿新 • • 發佈:2018-07-20
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、刪除鏈表的(重復)節點