• 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;
    }
}