标签:
首先对于一个有序的结点递增的链表,删除重复的结点,只保留一份重复的结点。
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