38
38
39
39
<!-- 这里可写通用的实现逻辑 -->
40
40
41
+ ** 方法一:一次遍历**
42
+
43
+ 我们先创建一个虚拟头节点 $dummy$,令 $dummy.next = head$,然后创建指针 $pre$ 指向 $dummy$,指针 $cur$ 指向 $head$,开始遍历链表。
44
+
45
+ 当 $cur$ 指向的节点值与 $cur.next$ 指向的节点值相同时,我们就让 $cur$ 不断向后移动,直到 $cur$ 指向的节点值与 $cur.next$ 指向的节点值不相同时,停止移动。此时,我们判断 $pre.next$ 是否等于 $cur$,如果相等,说明 $pre$ 与 $cur$ 之间没有重复节点,我们就让 $pre$ 移动到 $cur$ 的位置;否则,说明 $pre$ 与 $cur$ 之间有重复节点,我们就让 $pre.next$ 指向 $cur.next$。然后让 $cur$ 继续向后移动。继续上述操作,直到 $cur$ 为空,遍历结束。
46
+
47
+ 最后,返回 $dummy.next$ 即可。
48
+
49
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为链表的长度。
50
+
41
51
<!-- tabs:start -->
42
52
43
53
### ** Python3**
51
61
# self.val = val
52
62
# self.next = next
53
63
class Solution :
54
- def deleteDuplicates (self , head : ListNode) -> ListNode:
55
- dummy = ListNode(- 1 , head)
56
- cur = dummy
57
- while cur.next and cur.next.next:
58
- if cur.next.val == cur.next.next.val:
59
- val = cur.next.val
60
- while cur.next and cur.next.val == val:
61
- cur.next = cur.next.next
62
- else :
64
+ def deleteDuplicates (self , head : Optional[ListNode]) -> Optional[ListNode]:
65
+ dummy = pre = ListNode(next = head)
66
+ cur = head
67
+ while cur:
68
+ while cur.next and cur.next.val == cur.val:
63
69
cur = cur.next
70
+ if pre.next == cur:
71
+ pre = cur
72
+ else :
73
+ pre.next = cur.next
74
+ cur = cur.next
64
75
return dummy.next
65
76
```
66
77
@@ -81,17 +92,19 @@ class Solution:
81
92
*/
82
93
class Solution {
83
94
public ListNode deleteDuplicates (ListNode head ) {
84
- ListNode dummy = new ListNode (- 1 , head);
85
- ListNode cur = dummy;
86
- while (cur. next != null && cur. next. next != null ) {
87
- if (cur. next. val == cur. next. next. val) {
88
- int val = cur. next. val;
89
- while (cur. next != null && cur. next. val == val) {
90
- cur. next = cur. next. next;
91
- }
92
- } else {
95
+ ListNode dummy = new ListNode (0 , head);
96
+ ListNode pre = dummy;
97
+ ListNode cur = head;
98
+ while (cur != null ) {
99
+ while (cur. next != null && cur. next. val == cur. val) {
93
100
cur = cur. next;
94
101
}
102
+ if (pre. next == cur) {
103
+ pre = cur;
104
+ } else {
105
+ pre. next = cur. next;
106
+ }
107
+ cur = cur. next;
95
108
}
96
109
return dummy. next;
97
110
}
@@ -114,67 +127,84 @@ class Solution {
114
127
class Solution {
115
128
public:
116
129
ListNode* deleteDuplicates(ListNode* head) {
117
- ListNode* dummy = new ListNode(-1, head);
118
- ListNode* cur = dummy;
119
- while (cur->next != nullptr && cur->next->next != nullptr) {
120
- if (cur->next->val == cur->next->next->val) {
121
- int val = cur->next->val;
122
- while (cur->next != nullptr && cur->next->val == val) {
123
- cur->next = cur->next->next;
124
- }
125
- } else {
130
+ ListNode* dummy = new ListNode(0, head);
131
+ ListNode* pre = dummy;
132
+ ListNode* cur = head;
133
+ while (cur) {
134
+ while (cur->next && cur->next->val == cur->val) {
126
135
cur = cur->next;
127
136
}
137
+ if (pre->next == cur) {
138
+ pre = cur;
139
+ } else {
140
+ pre->next = cur->next;
141
+ }
142
+ cur = cur->next;
128
143
}
129
144
return dummy->next;
130
145
}
131
146
};
132
147
```
133
148
149
+ ### **Go**
150
+
151
+ ```go
152
+ /**
153
+ * Definition for singly-linked list.
154
+ * type ListNode struct {
155
+ * Val int
156
+ * Next *ListNode
157
+ * }
158
+ */
159
+ func deleteDuplicates(head *ListNode) *ListNode {
160
+ dummy := &ListNode{Next: head}
161
+ pre, cur := dummy, head
162
+ for cur != nil {
163
+ for cur.Next != nil && cur.Next.Val == cur.Val {
164
+ cur = cur.Next
165
+ }
166
+ if pre.Next == cur {
167
+ pre = cur
168
+ } else {
169
+ pre.Next = cur.Next
170
+ }
171
+ cur = cur.Next
172
+ }
173
+ return dummy.Next
174
+ }
175
+ ```
176
+
134
177
### ** C#**
135
178
136
179
``` cs
180
+ /**
181
+ * Definition for singly-linked list.
182
+ * public class ListNode {
183
+ * public int val;
184
+ * public ListNode next;
185
+ * public ListNode(int val=0, ListNode next=null) {
186
+ * this.val = val;
187
+ * this.next = next;
188
+ * }
189
+ * }
190
+ */
137
191
public class Solution {
138
- private ListNode newHead;
139
- private ListNode last;
140
- private ListNode candidate;
141
- private int count;
142
-
143
192
public ListNode DeleteDuplicates (ListNode head ) {
144
- while (head != null)
145
- {
146
- if (candidate == null || candidate.val != head.val)
147
- {
148
- TryAppend();
149
- candidate = head;
150
- count = 1;
151
- }
152
- else
153
- {
154
- ++count;
155
- }
156
-
157
- head = head.next;
158
- }
159
- TryAppend();
160
- if (last != null) last.next = null;
161
- return newHead;
162
- }
163
-
164
- private void TryAppend()
165
- {
166
- if (count == 1)
167
- {
168
- if (newHead == null)
169
- {
170
- newHead = last = candidate;
193
+ ListNode dummy = new ListNode (0 , head );
194
+ ListNode pre = dummy ;
195
+ ListNode cur = head ;
196
+ while (cur != null ) {
197
+ while (cur .next != null && cur .next .val == cur .val ) {
198
+ cur = cur .next ;
171
199
}
172
- else
173
- {
174
- last.next = candidate;
175
- last = last .next;
200
+ if ( pre . next == cur ) {
201
+ pre = cur ;
202
+ } else {
203
+ pre . next = cur .next ;
176
204
}
205
+ cur = cur .next ;
177
206
}
207
+ return dummy .next ;
178
208
}
179
209
}
180
210
```
@@ -194,27 +224,19 @@ public class Solution {
194
224
* @return {ListNode}
195
225
*/
196
226
var deleteDuplicates = function (head ) {
227
+ const dummy = new ListNode (0 , head);
228
+ let pre = dummy;
197
229
let cur = head;
198
- let pre = new ListNode (0 );
199
- pre .next = head;
200
- let dummy = pre;
201
- let rep = false ;
202
- if (! head || ! head .next ) {
203
- return head;
204
- }
205
230
while (cur) {
206
- while (cur .next && cur .val == cur .next .val ) {
231
+ while (cur .next && cur .val === cur .next .val ) {
207
232
cur = cur .next ;
208
- rep = true ;
209
233
}
210
- if (rep) {
211
- pre .next = cur .next ;
212
- cur = cur .next ;
213
- } else {
234
+ if (pre .next === cur) {
214
235
pre = cur;
215
- cur = cur .next ;
236
+ } else {
237
+ pre .next = cur .next ;
216
238
}
217
- rep = false ;
239
+ cur = cur . next ;
218
240
}
219
241
return dummy .next ;
220
242
};
@@ -236,21 +258,19 @@ var deleteDuplicates = function (head) {
236
258
*/
237
259
238
260
function deleteDuplicates(head : ListNode | null ): ListNode | null {
239
- const dummy = new ListNode (101 , head );
240
- let p = dummy ;
241
- let c = dummy ;
242
- let count = 1 ;
243
- while (c != null ) {
244
- if (c .val !== (c .next ?? {}).val ) {
245
- if (count === 1 ) {
246
- p = c ;
247
- } else {
248
- p .next = c .next ;
249
- }
250
- count = 0 ;
261
+ const dummy = new ListNode (0 , head );
262
+ let pre = dummy ;
263
+ let cur = head ;
264
+ while (cur ) {
265
+ while (cur .next && cur .val === cur .next .val ) {
266
+ cur = cur .next ;
267
+ }
268
+ if (pre .next === cur ) {
269
+ pre = cur ;
270
+ } else {
271
+ pre .next = cur .next ;
251
272
}
252
- c = c .next ;
253
- count ++ ;
273
+ cur = cur .next ;
254
274
}
255
275
return dummy .next ;
256
276
}
0 commit comments