【两次过】Lintcode 113. 删除排序链表中的重复数字 II

给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。

样例

给出 1->2->3->3->4->4->5->null,返回 1->2->5->null

给出 1->1->1->2->3->null,返回 2->3->null

解题思路:

    照例新建一个dummy节点作为首部,然后用两个指针left与right分别指向重复元素的前一个元素和重复元素的后一个元素,使得(left , right)之间为重复元素。如果中间没有重复元素则向后考察元素,如果有则将left->next = right即可删除中间重复元素。

    始终注意right不要越界问题!

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param head: head is the head of the linked list
     * @return: head of the linked list
     */
    ListNode * deleteDuplicates(ListNode * head) 
    {
        // write your code here
        ListNode * dummy = new ListNode(0);
        dummy->next = head;
        
        //使得(left,right)之间的元素是重复的数字,前开后开
        ListNode * left = dummy;//指向重复元素的前一个元素
        ListNode * right = head;
        
        while(right != NULL)
        {
            right = right->next;
            
            //将right指针指向重复元素的后一个元素
            while(right != NULL && left->next->val == right->val)
                right = right->next;
            
            if(left->next->next != right)//如果两指针间存在重复元素,则将left与right连接,删除重复元素
                left->next = right;
            else//否则就移动这两指针
                left = left->next;
        }
        
        return dummy->next;
    }
};


猜你喜欢

转载自blog.csdn.net/majichen95/article/details/80994868