使用 Go 解決 LeetCode 問題:83. Remove Duplicates from Sorted List

Description

Given a sorted linked list, delete all duplicates such that each element appear only once.

  • Example 1:
1
2
Input: 1->1->2
Output: 1->2
  • Example 2:
1
2
Input: 1->1->2->3->3
Output: 1->2->3

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// ListNode struct
type ListNode struct {
Val int
Next *ListNode
}

func deleteDuplicates(head *ListNode) *ListNode {
// 建立一個指向串列頭部節點的游標
cursor := head

// 疊代串列中的每一個節點
for cursor != nil {
// 判斷下一個節點存在,而且游標的值等於下一個節點的值
if cursor.Next != nil && cursor.Val == cursor.Next.Val {
cursor.Next = cursor.Next.Next

continue
}

// 偏移游標
cursor = cursor.Next
}

return head
}

Note

假設有以下參數:

1
head: 1->1->2->3

說明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
cursor 的 Next 指向 1 的記憶體位置,假設為 a。

--------------------------------------------------
c
head -> 1 (a) -> 1 (b) -> 2 (c) -> 3 (d) -> nil
--------------------------------------------------

第 1 次迴圈:

cursor 的值 1 等於下一個節點的值 1,因此將 cursor 的 Next 指向 c。

--------------------------------------------------
c
head -> 1 (a) -> 2 (c) -> 3 (d) -> nil
--------------------------------------------------

第 2 次迴圈:

cursor 的值 1 不等於下一個節點的值 2,因此將 cursor 指向 c。

--------------------------------------------------
c
head -> 1 (a) -> 2 (c) -> 3 (d) -> nil
--------------------------------------------------

第 3 次迴圈:

cursor 的值 2 不等於下一個節點的值 3,因此將 cursor 指向 d。

--------------------------------------------------
c
head -> 1 (a) -> 2 (c) -> 3 (d) -> nil
--------------------------------------------------

第 4 次迴圈:

cursor 的值 nil 等於 nil,因此將 cursor 指向 nil。

--------------------------------------------------
c
head -> 1 (a) -> 2 (c) -> 3 (d) -> nil
--------------------------------------------------

結束迴圈。

最後返回:1->2->3

Code