在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶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...