刪除鍊錶中重複的結點

2021-09-18 07:41:51 字數 2060 閱讀 5197

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

題目是要把所有重複的結點去掉,比如 1,1,1,2,3,3,4 變成 2,4,而不是 1,2,3,4

原地操作next指標,需要用到3個指標。由於頭結點也可能會被刪掉,所以還要建立乙個虛擬頭結點。

如果用不了3個指標,即鍊錶元素不超過1個,則直接返回

(1)先建立頭結點,i, j, k三個指標緊挨著*-

>1-

>1-

>2-

>3-

>3-

>4-

>

null

↑ ↑ ↑

i j k

(2)讓 k 盡量移遠到不等於 j 的地方*-

>1-

>1-

>2-

>3-

>3-

>4-

>

null

↑ ↑ ↑

i j k

(3)因為檢測到有重複,所以修改 i 後繼*--

----

----

->2-

>3-

>3-

>4-

>

null

↑ ↑ ↑

i j k

(4)讓 j, k 繼續挨著 i*--

----

----

->2-

>3-

>3-

>4-

>

null

↑ ↑ ↑

i j k

(5)重複第(2)步驟,發現檢測不到重複,這個時候集體往後移*--

----

----

->2-

>3-

>3-

>4-

>

null

↑ ↑ ↑

i j k

(6)重複第(2)步驟,檢測到重複,修改 i 後繼*--

----

----

->2--

----

----

->4-

>

null

↑ ↑ ↑

i j k

(6)重複第(4)步驟,這時已經有個指標到尾了,程式結束*--

----

----

->2--

----

----

->4-

>

null

↑ ↑ ↑

i j k

function

deleteduplication

(phead)

// 修改指標

if(repeat)

else

// i, j, k緊湊著

j = i.next

k = j ? j.next :

null

}// 輸出虛擬頭結點的後繼

return root.next

}

將值存到乙個棧中,如果當前入棧元素和棧頂元素相等,則不入棧且彈一次棧,最終將棧生成鍊錶返回

function

deleteduplication

(phead)

else}}

// 將棧轉成鍊錶

let root = stack.length ?

newlistnode

(stack[0]

):null

let p = root

for(let i =

1; i < stack.length; i++

)return root

}

刪除鍊錶中重複的結點

題目描述 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5。刪除鍊錶中重複的結點 author 過路的守望 public class duplicationnode 新建乙個節點指向頭結點 li...

刪除鍊錶中重複的結點

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 解法一 遞迴 public class listnode public class solution if phead.next.val phe...

刪除鍊錶中重複的結點

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 題目分析 刪除鍊錶中的結點要比較當前結點是否與前面結點和後面結點相同,只有兩個都不同的結點才保留。用pre儲存前乙個節點,cur儲存當前結點,c...