Skip to content

Commit 813cfdd

Browse files
committed
添加py和js,添加注释,去除去除多余代码
1 parent 8d3681f commit 813cfdd

File tree

1 file changed

+79
-18
lines changed

1 file changed

+79
-18
lines changed

animation-simulation/链表篇/leetcode82删除排序链表中的重复元素II.md

Lines changed: 79 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
#### [82. 删除排序链表中的重复元素 II](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/)
88

9-
题目描述
9+
**题目描述**
1010

1111
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。
1212

@@ -35,7 +35,7 @@
3535

3636
这个题目也是利用我们的双指针思想,一个走在前面,一个在后面紧跟,前面的指针就好比是侦察兵,当发现重复节点时,后面指针停止移动,侦察兵继续移动,直到移动完重复节点,然后将该节点赋值给后节点。思路是不是很简单啊,那么我们来看一下动图模拟吧。
3737

38-
注:这里为了表达更直观,所以仅显示了该链表中存在的节点
38+
注:这里为了表达更直观,所以仅显示了该链表中存在的节点
3939

4040
![删除重复节点2](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/删除重复节点2.3btmii5cgxa0.gif)
4141

@@ -46,28 +46,30 @@ Java Code:
4646
```java
4747
class Solution {
4848
public ListNode deleteDuplicates(ListNode head) {
49-
if(head == null||head.next==null){
50-
return head;
51-
}
49+
//侦察兵指针
5250
ListNode pre = head;
53-
ListNode low = new ListNode(0);
54-
low.next = pre;
55-
ListNode ret = new ListNode(-1);
56-
ret = low;
51+
//创建虚拟头节点,接上head
52+
ListNode dummy = new ListNode(-1);
53+
dummy.next = pre;
54+
//跟随的指针
55+
ListNode low = dummy;
5756
while(pre != null && pre.next != null) {
5857
if (pre.val == pre.next.val) {
58+
//移动侦察兵指针直到找到与上一个不相同的元素
5959
while (pre != null && pre.next != null && pre.val == pre.next.val) {
6060
pre = pre.next;
6161
}
62+
//while循环后,pre停留在最后一个重复的节点上
6263
pre = pre.next;
64+
//连上新节点
6365
low.next = pre;
6466
}
6567
else{
6668
pre = pre.next;
6769
low = low.next;
6870
}
6971
}
70-
return ret.next;
72+
return dummy.next;//注意,这里传回的不是head,而是虚拟节点的下一个节点,head有可能已经换了
7173
}
7274
}
7375
```
@@ -78,29 +80,88 @@ C++ Code:
7880
class Solution {
7981
public:
8082
ListNode* deleteDuplicates(ListNode* head) {
81-
if(head == nullptr || head->next == nullptr){
82-
return head;
83-
}
83+
//侦察兵指针
8484
ListNode * pre = head;
85-
ListNode * low = new ListNode(0);
86-
low->next = pre;
87-
ListNode * ret = new ListNode(-1);
88-
ret = low;
85+
//创建虚拟头节点,接上head
86+
ListNode * dummy = new ListNode(-1, head);
87+
dummy->next = pre;
88+
//跟随的指针
89+
ListNode * low = dummy;
8990
while(pre != nullptr && pre->next != nullptr) {
9091
if (pre->val == pre->next->val) {
92+
//移动侦察兵指针直到找到与上一个不相同的元素
9193
while (pre != nullptr && pre->next != nullptr && pre->val == pre->next->val) {
9294
pre = pre->next;
9395
}
96+
//while循环后,pre停留在最后一个重复的节点上
9497
pre = pre->next;
98+
//连上新节点
9599
low->next = pre;
96100
}
97101
else{
98102
pre = pre->next;
99103
low = low->next;
100104
}
101105
}
102-
return ret->next;
106+
return dummy->next;//注意,这里传回的不是head,而是虚拟节点的下一个节点,head有可能已经换了
103107
}
104108
};
105109
```
106110
111+
JS Code:
112+
113+
```javascript
114+
var deleteDuplicates = function(head) {
115+
//侦察兵指针
116+
let pre = head;
117+
//创建虚拟头节点,接上head
118+
let dummy = new ListNode(-1);
119+
dummy.next = pre;
120+
//跟随的指针
121+
let low = dummy;
122+
while(pre != null && pre.next != null) {
123+
if (pre.val == pre.next.val) {
124+
//移动侦察兵指针直到找到与上一个不相同的元素
125+
while (pre != null && pre.next != null && pre.val === pre.next.val) {
126+
pre = pre.next;
127+
}
128+
//while循环后,pre停留在最后一个重复的节点上
129+
pre = pre.next;
130+
//连上新节点
131+
low.next = pre;
132+
}
133+
else{
134+
pre = pre.next;
135+
low = low.next;
136+
}
137+
}
138+
return dummy.next;//注意,这里传回的不是head,而是虚拟节点的下一个节点,head有可能已经换了
139+
};
140+
```
141+
142+
Python Code:
143+
144+
```py
145+
class Solution:
146+
def deleteDuplicates(self, head: ListNode) -> ListNode:
147+
# 侦察兵指针
148+
pre = head
149+
# 创建虚拟头节点,接上head
150+
dummy = ListNode(-1, head)
151+
# 跟随的指针
152+
low = dummy
153+
while pre is not None and pre.next is not None:
154+
if pre.val == pre.next.val:
155+
# 移动侦察兵指针直到找到与上一个不相同的元素
156+
while pre is not None and pre.next is not None and pre.val == pre.next.val:
157+
pre = pre.next
158+
# while循环后,pre停留在最后一个重复的节点上
159+
pre = pre.next
160+
# 连上新节点
161+
low.next = pre
162+
else:
163+
pre = pre.next
164+
low = low.next
165+
return low.next # 注意,这里传回的不是head,而是虚拟节点的下一个节点,head有可能已经换了
166+
```
167+

0 commit comments

Comments
 (0)