leetcode - [鏈表] - (83) 刪除排序鏈表中的重複元素

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;
        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章