思路:
- 考虑 1->2->3->4->4->4->5->5->6->7
- 关键在于要把重复元素删干净。
- 没有遇到重复的,
pre cur
往后走 - 遇到重复的,
pre
不动,cur
往后走,cur.next.val != cur.val
处停止。 - 容易犯的错是:只考虑了两个重复,第三个重复就留下来了。
- 没有遇到重复的,
- if while的排放可以优化,下面是两版代码。
第四
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode pre = dummy, cur = head;
while (cur != null) {
if (cur.next != null && cur.val == cur.next.val) {//重复时
// 注意1,3,3,3,3的情况
while (cur.next != null && cur.val == cur.next.val) {//跳到不重复为止
cur = cur.next;
}
cur = cur.next;
pre.next = cur;
} else { //不重复时
cur = cur.next;
pre = pre.next;
}
}
return dummy.next;
}
}
第三版
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode pre = dummy, cur = head;
while (cur != null && cur.next != null) {
if (cur.val != cur.next.val) {//不重复时
pre = cur;
cur = pre.next;
} else {//重复时
while (cur.next != null && cur.val == cur.next.val) {
cur.next = cur.next.next;
}
cur = cur.next;
pre.next = cur;
}
}
return dummy.next;
}
}
第二版
先用if判断不重复,更简洁
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode cur = head, pre = dummy;
while (cur != null && cur.next != null) {
if (cur.val != cur.next.val) {//不重复时
pre = cur;
cur = cur.next;
} else {
while (cur.next != null && cur.val == cur.next.val) {//当遇到重复,把cur移到重复区域的最后一个节点
cur = cur.next;
}
pre.next = cur.next;//由于dup,把cur往后再挪一位,到不重复的新开始节点
cur = cur.next;
}
}
return dummy.next;
}
}
第一版
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode cur = head, pre = dummy;
while (cur != null) {
boolean dup = false;//重复吗
//当遇到重复,把cur移到重复区域的最后一个节点
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
dup = true;
}
if (dup) {
cur = cur.next;//由于dup,把cur往后再挪一位,到不重复的新开始节点
pre.next = cur;//连过来
} else {//不重复,直接过
pre = cur;
cur = cur.next;
}
}
return dummy.next;
}
}