牛客網:刪除連結串列中的重複結點(圖文並茂)
阿新 • • 發佈:2021-02-19
技術標籤:牛客網
題目描述
刪除連結串列中的重複結點
在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。
示例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;
}
};