- 1、假设有一个链表A[1,2,2,3,5,5,5],定义一个新链表B,设置哨兵节点-1,指向链表A,哨兵节点赋值给临时变量pre,链表B为[-1,,1,2,2,3,5,5,5],pre指向-1。
- 2、对A链表操作,cur=1,next=cur.next,当cur.val != next.val,pre指向cur的位置2,cur指向next的位置2
- 3、cur=2,next=2,cur.val == next.val,next后移到3,pre.next = 3,再次比较cur.val != next.val,即2!=3,cur移到next的位置。
- 4、cur=3,next=5,不相等,pre移到cur的位置,cur移到next的位置
- 5、cur=5,next=5,next后移到5,pre.next=5,再次比较cur.val = next.val,即5==5,next后移到null,pre.next=null
写的有点乱,感觉像复制了一整个链表,拿一个临时变量移动,当没有重复时,正常后移,有重复时,next跳过重复的地方,然后把变量再移动到跳过重复后next位置,周期往复。这道题还是必须设置哨兵节点,不然第一个重复的就去不掉了,因为空值没法next
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
public static ListNode deleteDuplicates(ListNode head) {
ListNode node = new ListNode(-1);
ListNode cur = head;
ListNode pre = node;
node.next = head;
ListNode next;
while(cur != null){
next = cur.next;
boolean flag = false;
while(next != null && cur.val == next.val){
flag = true;
next=next.next;
pre.next = next;
}
if(!flag)pre = cur;
cur = next;
}
return node.next;
}
}