Medium!
題目描述:
給定一個排序鏈表,刪除所有含有重復數字的節點,只保留原始鏈表中 沒有重復出現 的數字。
示例 1:
輸入: 1->2->3->3->4->4->5 輸出: 1->2->5
示例 2:
輸入: 1->1->1->2->3 輸出: 2->3
解題思路:
和之前那道 (http://www.cnblogs.com/grandyang/p/4066453.html) 不同的地方是這里要刪掉所有的重復項,由於鏈表開頭可能會有重復項,被刪掉的話頭指針會改變,而最終卻還需要返回鏈表的頭指針。所以需要定義一個新的節點,然后鏈上原鏈表,然后定義一個前驅指針和一個現指針,每當前驅指針指向新建的節點,現指針從下一個位置開始往下遍歷,遇到相同的則繼續往下,直到遇到不同項時,把前驅指針的next指向下面那個不同的元素。如果現指針遍歷的第一個元素就不相同,則把前驅指針向下移一位。
C++解法一:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *deleteDuplicates(ListNode *head) { 12 if (!head || !head->next) return head; 13 14 ListNode *start = new ListNode(0); 15 start->next = head; 16 ListNode *pre = start; 17 while (pre->next) { 18 ListNode *cur = pre->next; 19 while (cur->next && cur->next->val == cur->val) cur = cur->next; 20 if (cur != pre->next) pre->next = cur->next; 21 else pre = pre->next; 22 } 23 return start->next; 24 } 25 };
