劍指offer 面試題57:刪除連結串列中的重複節點 c++
阿新 • • 發佈:2018-11-20
本題有兩種
第一題:在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->3->4->5 ( 只是去掉了重複節點)
思路:兩個指標 一前一後,若前後相等,刪掉後面的
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead==nullptr) return nullptr; ListNode* pre=pHead; ListNode* p=pre->next; while(p!=nullptr) { if(pre->val == p->val) { pre->next = p->next; free(p); p=pre->next; continue; } pre=pre->next; p=p->next; }return pHead; } };
第二題:在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5 (只要節點重複了刪除所有值一樣的節點)(注意和上面題目區別)
思路:先處理如果要刪除的是第一個節點的情況,先建一個頭結點給原來連結串列,這樣操作就統一了。三個指標,pre是當前指標前一個,p是當前指標,pnext是下一個,如果一直是p->val==pnext,那就刪掉,直到兩個 不相等
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead==nullptr ) return nullptr; ListNode* newhead = new ListNode(-1); newhead->next=pHead; ListNode* pre=newhead; ListNode* p=pHead,*pnext =p->next; while(p!=nullptr &&p->next!=nullptr) { if(p->val == pnext->val) { while(pnext!=nullptr && pnext->val==p->val) { ListNode* temp = pnext; pnext=pnext->next; free(temp); temp=nullptr; } pre->next=pnext; p=pnext; }else{ pre=p; p=p->next; } pnext=p->next; }return newhead->next; } };