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

2022-05-07 02:03:07 字數 2961 閱讀 1037

題目描述:

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

解題思路:

首先初始化乙個起始指標prenode指向頭結點、工作指標walknode指向鍊錶的第乙個元素,即prenode.next=walknode。

迭代開始:

while(walknode!=null)

注意:因為可能會刪除頭結點,例如,刪除了頭結點1和第乙個結點1,結果應為。但是如果直接將函式傳進來的phead作為頭結點,即初始化prenode=phead,那麼頭節點永遠不可能被刪除,得到的結果只能為。

因此這裡新增了乙個新的頭節點newhead,將phead當一般結點處理,初始化prenode=newhead這樣就可以避免出現上面的錯誤。

舉例:

1->2->3->3->4->4 (

加入新頭結點newhead:newhead.val=0,;ewhead.next=phead) 0

->1->2->3->3->4->4

初始化:

prenode指向新的頭結點,walknode指向第乙個結點

第1次迭代:

walknode1與其下乙個結點2不相同,而且prenode0和walknode1相鄰,說明之前也沒有出現過重複結點,所以把兩個指標都前移

第2次迭代:

同第一次迭代

第3次迭代:

walknode3與下乙個結點3重複,那麼此時prenode不移動,只移動walknode

第4次迭代:

walknode3與其下乙個結點4不相同,但是此時prenode和walknode不相鄰,說明prenode和walknode中間出現了重複結點,所以把prenode直接指向walknode的下乙個結點,拋棄中間重複節點

第5次迭代:

walknode4與下乙個結點4重複,那麼此時prenode不移動,只移動walknode

第6次迭代:

walknode.next==null&&pre.next!=walknode:pre.next=walknode.next;return newnode.next;

**實現

1

package

struct;

2public

class

deletelist 9//

}10public

listnode printlistfromtailtohead(listnode phead)

12 newhead.next=phead;

13 listnode pre=newhead;

14 listnode walknode=newhead.next;

15while(walknode!=null)22

else

2326}27

}28else

33else

3437

}38 walknode=walknode.next; 39}

40return

newhead.next; 41}

42 }

牛客 刪除鍊錶中重複的結點

題目描述 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 1,申請乙個新的鍊錶儲存刪除重複結點後的鍊錶 2,注意是將所有重複的結點全部刪除 3,定義乙個p指標指向原鍊錶,乙個指標newp指向新...

牛客網 刪除鍊錶中重複結點

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5。對於這個題 思路是 1.首先new乙個新的結點head作為頭結點,head指向鍊錶的第乙個結點,新new乙個頭結點是為了防止鍊錶第乙個結點開始就...

牛客網 刪除鍊錶中重複的結點

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 這種遞迴的鍊錶的解法看起來題目很簡單,答案也很簡單,但是遞迴過程中的變數變化邏輯很重要,可以畫圖來慢慢琢磨。class solution def...