1. 程式人生 > 其它 >牛客網:刪除連結串列中的重複結點(圖文並茂)

牛客網:刪除連結串列中的重複結點(圖文並茂)

技術標籤:牛客網

題目描述

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

在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點重複的結點不保留,返回連結串列頭指標。

示例1:

輸入:{1,2,3,3,4,4,5}
輸出:{1,2,5}

題解

本題可採用三個指標,指標prev用來包存前一個結點的資訊,指標tail 和 tmp 用來尋找重複結點。(因為連結串列是已經排好序的,所有重複結點一定排在一起)

初始情況
在這裡插入圖片描述
①當tail -> val 和 tmp -> val 不相同時,更新這三個指標的位置,則prev = tmp 、tmp = tail 、tail = tail -> next。

在這裡插入圖片描述
②當tmp 和 tail 的 val 相同時,tail 就一直向後走,直至和 tmp 的 val 不同
在這裡插入圖片描述
然後tmp一直向後走迴圈的刪除這些重複結點,直至tmp == tail 為止
在這裡插入圖片描述
③迴圈步驟①②,直至tail指向NULL為止
在這裡插入圖片描述

題解程式碼


class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == NULL || pHead->next == NULL)
        {
            return pHead;
        }
ListNode* prev = NULL,*tail = pHead->next,*tmp = pHead; while(tail) { //當結點不相同時,則更新三個指標的位置 if(tmp->val != tail->val) { prev = tmp; tmp = tail; tail = tail->next; } else
{ //獲得不相同的結點 while(tail && tmp->val == tail->val) { tail = tail->next; } //刪除從tmp到tail之間的值 while(tmp!=tail) { ListNode* del = tmp; tmp = tmp->next; free(del); } if(prev == NULL) { //如果開始就有兩個結點是相等的,則直接將首指標給tmp/tail,因為第3個while迴圈已經得出tmp == tail了 pHead = tmp; }else{ //不是的話就用prev進行連線 prev->next = tmp; } } //若為空,則表明連結串列的結點從某個位置一直到尾部是相等的,則tmp不變即可(此時tail也為空) //若不為空,則更新tail的指標,往後走一個。 if(tmp) { tail = tmp->next; } } return pHead; } };