引用在鍊錶刪除結點的巧妙用法

2021-10-08 15:59:15 字數 694 閱讀 2727

最近複習到資料結構的鍊錶部分,做到了一道題,題目為設計乙個遞迴演算法,刪除不帶頭結點的單鏈表l中所有值為x的結點。

在答案中,可以看到當刪除結點時,是令l=l->next,隨後直接free了p指標。猛然一看,可能就會很迷惑為什麼沒有更改刪除結點前驅結點的next,直接就free了,這樣不會造成斷鏈嗎?

但是大家仔細觀察該函式的形參,第乙個引數為引用型別,引用也就相當於我有乙個物品a,我又給它起了個名字叫做b,本質上是乙個東西,只是名字進行了改變。這樣對於前驅結點的next賦值有什麼用呢?

用處在於,在else語句中,在當前結點的data值不為x時,我們遞迴呼叫del_x_3函式的時候,傳遞的引數是當前結點的next,也就是說,我們在這種情況下,所呼叫的實參&l,只是前驅結點的另乙個名字而已。為了便於理解,我們暫且假設當前結點的名字為a,且a結點的data值不為x,下乙個結點b的data值為x,所以在a結點執行else中遞迴呼叫del_x_3函式的時候,我們將a->next作為引數,傳入了函式,接著繼續執行遞迴呼叫的函式,此時當前結點轉換為b,由於b的data值前提中假設為x,所以執行if語句中的l=l->next語句,其實就是執行a->next=a->next->next=b->next,因為當前l的值就是a->next。這樣就完成了對當前結點的前驅結點的next值的更新

刪除鍊錶的結點

1.問題描述 給定鍊錶的頭結點和待刪除結點,要求刪除鍊錶的結點要求時間複雜度為o 1 來自 劍指offer 2.分析 我們都知道鍊錶的要想訪問某個結點必須要從頭結點挨個遍歷,並且單鏈表我們沒有指向前驅的結點,因此我們可以用狸貓換太子 用這個待刪除結點的下個結點裡面的內容,複製到這個待刪除結點,然後刪...

刪除鍊錶的結點

刪除鍊錶的結點 請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾的 節點,您將只被給予要求被刪除的節點。比如 假設該鍊錶為1 2 3 4,給定您的為該鍊錶中值為3的第三個節點,那麼在呼叫了您的函式之後,該鍊錶則應變成1 2 4。這道題讓我們刪除鍊錶的乙個節點,更通常不同的是,沒有給我們鍊錶的起點...

鍊錶結點的刪除

鍊錶結點的刪除 結點的刪除分為兩種情況 1 刪除頭結點。需要改變頭指標位置 2 刪除中間,尾結點。帶刪除結點的前驅必須有指標,將帶刪除結點的前驅與帶刪除結點的後繼連起來 例題1 設head指向乙個非空單項鍊表,且資料域的值不重複,在鍊錶中刪除關鍵字值為key的結點。分析 第一步 查詢值為key的結點...