[leetcode] 82.Remove Duplicates from Sorted List II

来源:互联网 发布:网易大数据平台 编辑:程序博客网 时间:2024/06/11 21:47

题目:
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.
题意:
这道题跟83题有所不同,这道题需要将有重复的节点全部删除。
思路:
遍历整个链表,保留两个指针,一个是当前扫描的指针front,一个是与front的val值不一样的指针tail。如果tail就是front->next,那说明front只出现了一次,保留该节点,否则说明这个值出现了不止一次,不需要保留。newHead用来保存新的链表的头结点,newTail保留新的链表的最后的节点位置。
代码如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* deleteDuplicates(ListNode* head) {        if(head == NULL)return head;        ListNode *newHead = NULL,*front = head,*tail = head->next,*newCurr = NULL;        while(tail != NULL){            while(tail != NULL && tail->val == front->val) tail = tail->next;            if(tail == front->next){                if(newHead == NULL){                    newHead = front;                    newTail = newHead;                }                else {                    newTail->next = front;                    newTail = newTail->next;                }            }            front = tail;            tail = ((tail == NULL)?NULL:tail->next);        }        if(front != NULL && tail == front->next){            if(newHead == NULL){                newHead = front;                newTail = newHead;            }            else {                newTail->next = front;                newTail = newCurr->next;            }        }        if(newTail != NULL)newTail->next = NULL;        return newHead;    }};
0 0
原创粉丝点击