JZ76 刪除連結串列中重複的節點

蓝色的海嗷發表於2024-04-13

1、相似題
image
image

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {

        //判空
        if(head == NULL )
            return nullptr;

        ListNode* p1 = head;
        ListNode* p2 = p1->next;
        while(p2)
        {
            if(p1->val != p2->val)
            {
                p1->next = p2;
                p1 = p1->next;
            }
            p2 = p2->next;
        }
        p1->next = p2;
        return head;
    }
};

2、JZ76 刪除連結串列中重複的節點
image
image


/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {

        if(pHead == NULL ) return nullptr;

        ListNode* p = new ListNode(-1);
        p->next = pHead;
        ListNode* p1 = p;
        while(p1->next)
        {
            //設定p2指向p1的下一個的下一個節點
            ListNode* p2 = p1->next->next;
            //當p2不為空 且 p1的下一個的下一個節點的值等於p2的值 時迴圈
            while(p2 && p1->next->val == p2->val)
                p2 = p2->next;  //p2往後移動
            
            //判斷p2是否往後移動,如果沒有,則說明沒有相同的節點出現,讓p1往後移動
            if(p1->next->next == p2)    
                p1 = p1->next;
            //如果p2往後移動,就說明出現了重複的節點
            //那麼p1和p2之間的節點就都是重複的節點,都是需要刪除的節點
            else
                p1->next = p2;
        }
        return p->next;


    }
};

相關文章