1、問題描述
給定一個排序鏈表,刪除鏈表中的重複元素,使得鏈表中的每個元素只出現一次。
示例:
輸入:1->2->2->3->4->4->5
輸出:1->2->3->4->5
2、解題思路
- 邊界條件與特殊情況:(1)鏈表爲空;
- 解題思路:類比排序數組中刪除重複元素的想法,如果後一個數等於前一個數,則直接該數後面所有的數往前挪一位,我們可以使用兩個指針p1,p2來指向兩個相鄰的節點,p1指向前一個節點,p2指向後一個節點,如果p1->val等於p2->val,則進行如下循環:令p1->next = p2->next,刪除p2所指向的節點,p2 = p1->next。
- 當p1->val不等於p2->val時,令p1指向下一個節點,p2指向p1的下一個節點,直到p2爲空大的循環停止。
- 數據結構:
- p1,p2指針;
- 初始化:p1指向鏈的一個節點,p2指向鏈表的第二個節點;
- 處理邏輯:
當p2不爲空時,循環:
當p1->val == p2->val時,循環:
p1->next = p2->next
del p2;
p2 = p1->next;
p1 = p1->next;
p2 = p1->next;
3、代碼實現
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL)
{
return head;
}
ListNode* p1 = head;
ListNode* p2 = p1->next;
while(p2 != NULL){
while(p2 != NULL && p1->val == p2->val){
p1->next = p2->next;
delete p2;
p2 = p1->next;
}
p1 = p1->next;
if(p1 != NULL){
p2 = p1->next;
}
}
return head;
}
};