劍指offer 刪除該鍊錶中重複的結點

2021-08-26 08:52:51 字數 1818 閱讀 1244

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

設定三個指標,pre,curr,next。curr代表當前節點,pre代表前一節點,next代表後一節點,思路是每次如果next與curr的值相等,就將next後移直到next指向第乙個與curr值不相等的節點,直接令pre->next=next,這樣就將curr到next之間重**節點全部刪除了。重點是要特別注意刪除頭結點的情況。

初始時curr指向頭結點,next指向下一節點,如果next和curr的值不相等,就令pre=curr,curr=pre->next。如果next和curr的值相等,就將next往後移一位,一直到next的值與curr的值不相等。此時如果curr是頭結點,就重新設定頭結點為next指向的節點,curr=next;如果不是頭結點,就令pre->next=next,curr=pre->next。

特別注意:

在一切有->next操作的地方都要先確保當前節點不為空。

在判斷相等的時候,不能直接判斷節點,而是判斷value,因為next指標不同。

ac**

/*

struct listnode

};*/

class solution

if(curr==phead)

phead=pnext;

else

pre->next=pnext;

curr=pnext;

}else

}return phead;

}};

越界?特別注意在一切有->next操作的地方都要先確保當前節點不為空。修改之後還是不對,因為phead重複的情況應該放在迴圈裡面處理,不應該只單獨處理一次。會出現測試用例:

/*

struct listnode

};*/

class solution

phead=pnext;

}if(phead==null||phead->next==null)

return phead;

listnode* pre=phead;

curr=pre->next;

while(curr!=null&&curr->next!=null)

pre->next=pnext;

}else

pre=curr;

curr=pre->next;

} return phead;

}};

之前理解錯題意,以為將有重複的元素還保留下來,輸出1->2->3->4->5。**如下:要特別注意如果pnode=null,就不能再做->next的操作了,不然會越界報錯,所以while裡面除了有兩個越界檢查條件。

/*

struct listnode

};*/

class solution

pnode=pnode->next;

} return phead;

}};

上面兩個ac版本分別對應leetcode82和83

leetcode 82 ac**如下

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

if(curr==head)

else

}else

}return head;

}};

劍指offer 鍊錶 刪除鍊錶中的重複節點

題目在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 思路分析 思路一 使用linkedlist儲存不重複節點,重構鍊錶 分析評價 這個方法是乙個比較直接且容易想到的方法,使用時只要注意一些情況...

劍指offer 刪除鍊錶中重複的結點(鍊錶)

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 class solution listnode ans newlistnode 1 ans next phead listnode link a...

劍指Offer 鍊錶 刪除鍊錶中重複的結點

題目 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5。注意該鍊錶為排序鍊錶,重複的節點不保留哦!public class listnode 1 遞迴 遞迴的方法就像是先判斷第乙個節點和之後的節...