不带头节点的链表有哪些缺点_14. 删除链表中重复的结点
刪除鏈表中重復的結點
題目描述
在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5
寫鏈表中我們知道對于單鏈表訪問最大的缺點就是只能單向,從前向后,所以我們刪除也是一樣,刪除當前就得知道當前的上一個節點,那么我們這里采用指針記錄的方式。
方法1(粗暴)
我們采用最容易想到的方法,不用考慮時間效率與空間效率問題,就直接用遍歷,用一個哈希表結構來記錄每個節點對應的值在節點中出現了幾次,統計完成后,然后通過哈希表中如果出現次數為大于等于2,再用兩個指針一個前一個后開始找對應的值就行了,如果后一個指針指向的節點的值為哈希表中出現次數大于等于2的數,那么前一個指針指向后一個指針的next然后刪除后一個指針所指向的節點,讓后一個指針重新指向前一個指針的next,就這樣就可以完成刪除。
雖然這個方法可以,但是時間復雜度為O(N), 空間復雜度為一個哈希表的結構,所以采用這種不是最佳選擇。
方法2(三指針法)
采用三個指針來進行遍歷,同時刪除重復的節點,因為是有序的鏈表,我們就可以確定,重復的元素肯定是在一塊鏈接,所以我們就可以,用三指針,我們這里就叫
pre、cur、nex 分別代表的是前中后三個指針,我們在考慮的情況中,如果頭節點開始就重復,我們就處理很起來多了一種情況就需要額外處理,所以我們添加一個頭節點,變成帶頭節點,保證了頭節點開始不會重復,那么我們就可以讓開頭是pre指向帶頭的節點,cur指向pre的next,nex指向cur的next。
接下來我們就可以看cur是否和nex相等,相等就讓nex繼續向下走,不相等然后再處理刪除,cur開始到nex中間節點都是要刪除的(包含cur指向,不包含nex指向)刪除,就用到了pre,刪除完成讓pre指向cur就可以了。
如果cur值與nex值不相等,那么就可以三個指針各自往前移動一個。
注:在實現時,自己添加一個頭結點,把頭結點鏈接到鏈表上,方便。
總結
以上是生活随笔為你收集整理的不带头节点的链表有哪些缺点_14. 删除链表中重复的结点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python websocket模块_p
- 下一篇: c++ 打印条码_金蝶盘点机PDA仓库条