题目:
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;
}
};