LeetCode(82):刪除排序鏈表中的重復元素 II


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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM