leetcode之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, return 2->3.

这道题比上一道题难度大很多,首先,好多情况都要考虑

因为是要删除链表中的重复元素,所以要分好多种情况,如果整个链表的元素相同?如果头结点和第二个元素相同?如果最后两个元素相同?

这道题自己没想起来,看剑指offer上面试题57才有了大致的思路,定义一个指向head的结点可以省好多事

另外,定义了一个布尔变量,如果值相同,就代表应该删除,这里很巧妙的如果布尔值为true那么我继续指向下一个元素,否则两个指针都向前推进。

下面附上代码:

public ListNode deleteDuplicates(ListNode head) {
          if(head == null || head.next == null) return head;  
        ListNode newHead = new ListNode(-1);  
        newHead.next = head;  
        ListNode p1 = newHead;  
        ListNode p2 = head;  
        while(p2!=null){  
            boolean dup = false;  
            while(p2.next!=null && p2.val == p2.next.val){  
                dup = true;  
                p2 = p2.next;  
            }  
            if(dup){  
                p2 = p2.next;  
                continue;  
            }  
            p1.next = p2;  
            p1 = p1.next;  
            p2 = p2.next;  
        }  
        p1.next = p2;  
        return newHead.next;   
    }

  稍后再看看剑指offer上的源码。

原文地址:https://www.cnblogs.com/gracyandjohn/p/4444305.html