Remove Duplicates from Sorted List II

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return2->3.

思路

与I的区别就是要把所有重复的node删除。因此,还是利用I中去重的方法,但是增加一个新的指针,指向当前的前一个node,使用3个指针(prev,current,post)来遍历链表

  1. 最开始还是需要建立一个dummy,让dummy的next指向head。然后,初始化3个指针:
  ListNode pre = dummy; //prev
  ListNode cur = dummy.next; //current
  ListNode next = dummy.next.next; //post
  1. 引入一个布尔型的判断flag,来帮助判断当前是否遇到有重复,这个flag能帮助识别是否需要删除重复。
  • 当没有遇到重复值(flag为false)时,3个指针同时往后移动:
 pre = cur;
 cur = next;
 next = next.next;
  • 当遇到重复值时,设置flag为true,并让next一直往后找找到第一个与cur值不等的位置时停止,这时让pre的next连上当前的next,这样就把所有重复值略过了。 然后,让cur和next往后挪动继续查找;同时重置flag为false。
 cur = next;
 next = next.next;

注意:当链表的尾部出现连续的重复节点的情况
例如2->3->3->3->null,next==null,这时cur指向的值肯定是需要被删除的,所以要特殊处理:如果在cur.val == next.val的情况下,next==null,把重复值删掉。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode cur = dummy.next;
        ListNode next = dummy.next.next;
        boolean isDelete = false;
        
        while (next != null) {
            if (next.val == cur.val) {
                next = next.next;
                isDelete = true;
                if (next == null) {
                    pre.next = null;
                }
            } else {
                if (isDelete) {
                    pre.next = next;
                    cur = next;
                    next = next.next;
                    isDelete = false;
                } else {
                    pre = cur;
                    cur = next;
                    next = next.next;
                }
            }
        }
        return dummy.next;
    }
}

你可能感兴趣的:(Remove Duplicates from Sorted List II)