Remove Duplicates from Sorted List
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2
, return 1->2
.
Given 1->1->2->3->3
, return 1->2->3
.
思路:
用两个指针。一个指针不断前进,另一个指针不动。比较两个指针对应结点的值。如果不同,则删除两个指针之间的所有元素。之后不动的指针移动到移动指针的位置,移动指针继续前进。要处理好最后几个元素的值相同的情况。
题解:
/**
* 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) {
// empty list
if (head == nullptr)
return nullptr;
int current_value;
ListNode* fwd_iter = head->next;
ListNode* iter = head;
current_value = head->val;
while(fwd_iter != nullptr)
{
if (current_value != fwd_iter->val)
{
if (fwd_iter != iter->next)
{
ListNode* recycle = iter->next;
while(recycle != fwd_iter)
{
ListNode* tmp = recycle;
recycle = recycle->next;
delete tmp;
};
}
iter->next = fwd_iter;
iter = fwd_iter;
current_value = iter->val;
}
fwd_iter = fwd_iter->next;
}
if (iter->next != nullptr)
{
ListNode* recycle = iter->next;
while(recycle != nullptr)
{
ListNode* tmp = recycle;
recycle = recycle->next;
delete tmp;
}
iter->next = nullptr;
}
return head;
}
};