劍指Offer面試題18 刪除鍊錶的節點

2021-09-20 15:21:50 字數 1392 閱讀 9690

刪除鍊錶的節點

struct listnode

};void deletenode(listnode** plisthead,listnode* ptobedelete)

if(ptobedelete->next!=nullptr)//要刪除的節點不是尾節點

else //要刪除的節點為尾節點

p->next=nullptr;

delete ptobedelete;

ptobedelete=nullptr;

}}

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

解題思路:

採用三個指標來進行遍歷,同時刪除重複的節點,因為是有序的鍊錶,我們就可以確定,重複的元素肯定是在一塊鏈結,所以我們就可以,用三指標,我們這裡就叫

pre、cur、nex 分別代表的是前中後三個指標,我們在考慮的情況中,如果頭節點開始就重複,我們就處理很起來多了一種情況就需要額外處理,所以我們新增乙個頭節點,變成帶頭節點,保證了頭節點開始不會重複,那麼我們就可以開是讓pre指向帶頭的節點,cur指向pre的next,nex指向cur的next。

接下來我們就可以看cur是否和nex相等,相等就讓nex繼續向下走,不相等然後再處理刪除,cur開始到nex中間節點都是要刪除的(包含cur指向,不包含nex指向)刪除,就用到了pre,刪除完成讓pre指向cur就可以了。

如果cur值與nex值不相等,那麼就可以三個指標各自往前移動乙個。

這題是要考慮**的完整性的,我們要盡可能多的考慮各種情況的輸入:

1)傳null

2)只有乙個節點

3)頭節點開始就有重複

4)中間節點重複

5)尾部節點重複

6)鍊錶中沒有重複鍊錶

7)所有節點都是重複的

解題**:

/*

struct listnode

};*/

class solution

// 如果沒有重複的那麼cur的next一定等於nex

if (cur->next != nex) // 如果相等說明沒有相同的節點

if (nex != null) // 這裡一定要要注意,要防止走到null發生段錯誤

nex = nex->next;

}else

}listnode* head = dummy->next; // 釋放空間,防止記憶體洩漏

delete dummy;

return head;

}};

劍指offer 面試題18 刪除鍊錶的節點

給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o 1 時間內刪除該節點。鍊錶節點與函式的定義如下 public static class listnode 將要刪除節點的next節點直接複製到該節點上。刪除原先的next節點 public void deletenode listnode hea...

面試題18 劍指offer 刪除鍊錶的節點

題目一 在o 1 時間刪除鍊錶結點。給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。思路 由於單向鍊錶只有next指標,要刪除給定節點必須要知道它的上乙個節點,通常會從頭遍歷複雜度為o n 不滿足題目,可以將給定節點的下乙個節點的值賦值給給定節點,然後刪除給定節點的下乙個節...

劍指offer 面試題18 刪除鍊錶的節點

給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。注意 此題對比原題有改動 示例 1 輸入 head 4,5,1,9 val 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 1 9.示例 2 輸入...