如何刪除鍊錶中值重複的節點

2022-05-04 20:06:13 字數 1812 閱讀 2306

最近在刷《劍指offer》的題,其中有一道題目叫做刪除鍊錶中重複的節點,我想了半天沒想到比較好的解決辦法,於是看了看大佬的解析(菜哭了)。不看不知道,一看嚇一跳,這尼瑪寫的也太妙了,忍不住寫篇部落格記錄一下這個解題思路和**。

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

這道題我們分兩種情況來考慮:

首先第一種情況:頭節點的值存在重複;比如1->1->1->2->3->3->4,前面這個鍊錶的頭節點重複了3次,所以這時候,我們應該捨棄前3個重複的節點1,將2作為新的頭節點,再繼續向後判斷;

第二種情況就是頭節點並不與它的下乙個節點重複;比如上面的這個鍊錶,我們去除了前面的3個1之後,剩下2->3->3->4,這時候,頭節點不與後面的節點重複了,那我們保留頭節點,並繼續向後判斷,發現後面後面的兩個3發生了重複,於是,我們去除這個兩個節點,並讓原來頭節點的next指向去除重複後的下乙個位置,也就變成了2->4;若4後面還有其他重複,則我們去除重複後,讓4指向剩下的部分;

其實上面的思路並不是很難想到,關鍵是**如何實現呢?下面這個**就是大佬對於上面這個思路的實現:

public listnode deleteduplication(listnode phead) 

// 儲存頭節點的下乙個節點,上面已經判斷了phead.next不是空

listnode next = phead.next;

// 若頭節點的值與下乙個節點的值相同

if(phead.val == next.val) while(next != null && next.val == phead.val);

// 捨棄前面的所有重複節點,將當前第乙個與頭節點不同的節點作為頭節點,遞迴呼叫原方法,並直接返回

return deleteduplication(next);

}else

}

// 以下是節點listnode

class listnode

}

上面的**我加了點注釋,看得難受可以複製到編輯器中,刪掉注釋再看。

上面這段**,給我的感覺就是把遞迴用的出神入化(可能是我太菜了)。除去注釋,短短幾行**,就將上面的思路完全實現,下面我來解讀一下:

上面的**首先做了特判,若傳入的頭節點是空,或者沒有後續節點,那就不用去重,直接返回。這之後,先將頭節點的下乙個節點儲存。

我們先判斷當前是否滿足前面說的第一種情況:頭節點發生了重複,若發生了這種情況,就一直向後找,直到找到第乙個不與頭節點重複的節點,然後我們捨棄前面的節點,把這個節點當作頭節點,遞迴呼叫方法,並直接將返回值返回,這相當於是把後面剩下的部分當作一條新的鍊錶,而前面重複的就直接捨棄了;

若當前鍊錶是我們之前說的第二種情況:頭節點不重複,則我們將頭節點的下乙個節點作為引數,遞迴呼叫原方法,將除去頭節點後的子鍊錶看作是乙個新鍊錶,而方法返回值就是這個子煉表去重後的鍊錶,我們將其與原來頭節點關聯,就完整地去重了。

上面**最精妙的地方就是遞迴,將原煉表中除去頭節點的剩餘部分,當作乙個新鍊錶進行處理,短短幾行**,就實現了去重。

刪除鍊錶的重複節點

思路 就是找到不重複出現的節點,然後連線到新鍊錶上面 反思 在連線節點到新鍊錶的時候,每次都要把尾部節點的next指標設定為空!以防當前尾部節點真的是最後乙個節點卻沒給next設定指標域為空 struct listnode class solution listnode temp pnode 此時指...

鍊錶的重複節點刪除

題目一 力扣83 刪除重複的節點 保留重複的節點 給定乙個排序鍊錶,刪除所有重複的元素,使得每個元素只出現一次。示例 1 輸入 1 1 2 輸出 1 2 示例 2 輸入 1 1 2 3 3 輸出 1 2 3 解法1 使用set去重,思路很簡單。時間複雜度o n 空間複雜度o n public sta...

鍊錶(刪除重複的節點)

題目要求 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 題解 先判空和長度是否為一 定義兩個指標和乙個傀儡節點 用cur當游標遍歷鍊錶,當cur的值和cur.next的值相等時,prev不動...