标签:
首先对于一个有序的结点递增的链表,删除重复的结点,只保留一份重复的结点。
Given 1->1->2, return 1->2. Given 1->1->2->3->3, return 1->2->3.
只需要一个结点指针就能够完成操作。
ListNode* deleteDuplicates(ListNode* head)
{
if(head == NULL)
{
return NULL;
}
ListNode *r = head;
while(r->next != NULL)
{
if(r->val == r->next->val)
{
ListNode *tmp = r->next;
r->next = tmp->next;
delete tmp;
tmp = NULL;
}
else
{
r = r->next;
}
}//while
return head;
}
Given 1->2->3->3->4->4->5, return 1->2->5. Given 1->1->1->2->3, return 2->3.
注意这里有可能把头指针指向的结点删除了,所以要利用一个头结点,这样的话就可以不用单独的处理删除头指针指向的结点了。
ListNode* deleteDuplicates(ListNode* head)
{
ListNode *start = new ListNode(-1);
start->next = head;
if(head == NULL || head->next == NULL)
{
return head;
}
ListNode *pre = start;
while(pre->next != NULL)
{
ListNode *cur = pre->next;
while(cur->next != NULL && cur->next->val == cur->val)
{
cur = cur->next;
}//while
if(cur == pre->next)
{
pre = pre->next;
}
else
{
ListNode *tmp = pre->next;
pre->next = cur->next;
DeleteListNode(tmp, cur);
}//else
}//while
return start->next;
}
void DeleteListNode(ListNode *start, ListNode *end)
{
ListNode *tmp = NULL;
while(start != end)
{
tmp = start;
start = start->next;
delete tmp;
}
delete start;
}
标签:
原文地址:http://www.cnblogs.com/stemon/p/4757431.html