1.問題描述
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5.
2.解決思路
1)鏈表爲空,無重複;
2)鏈表只有一個結點,不存在重複;
3)鏈表有2個以上結點:考慮頭結點是否會被刪除的特例
a)爲了防止頭結點重複需要刪除,在頭結點前面添加一個僞結點first;
b)使用兩個輔助指針node1和node2,一前一後初始時分別指向first和head;
c)向右遍歷鏈表的值,node1的下一個永遠是不重複的值,比較相鄰的node2和node2的下一個指向的值是否相等;
11)相等:把當前值value保存下來,找到所有值等於value的,直到出現第一個不等於value的結點,讓node1指向它;
22)不相等:node1和node2都依次向右挪動一個;
3.代碼實現
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* head)
{
if(head == NULL || head->next == NULL)
return head;
//增加一個僞結點,以防出現頭結點被刪除的情況
ListNode *first = new ListNode(-1);
first->next = head;
ListNode* node1 = first;
ListNode* node2 = head;
while(node2 != NULL && node2->next != NULL){
if(node2->val != node2->next->val){
node1 = node2;
node2 = node2->next;
}
else{
int value = node2->val;
while(node2 != NULL && node2->val == value){
node2 = node2->next;
}
node1->next = node2;
}
}
return first->next;
}
};