面試題18 刪除鍊錶的結點

2021-10-05 16:05:05 字數 1998 閱讀 4095

題目1:在o(1)的時間內刪除鍊錶結點

給定單項鍊表的頭指標和乙個結點指標,定義乙個函式在o(1)的時間內刪除該結點。

分析:要在o(1)的時間內刪除結點,按照常規的找到刪除結點的上乙個結點,然後刪除該結點的思路肯定行不通。但是我們可以將待刪除的結點的下乙個結點的值賦給待刪除結點,然後刪除下乙個結點,可以達到同樣的目的。但以下幾個問題要注意:

待刪除的結點是單項鍊表最後乙個結點;

待刪除的結點是頭結點(為簡化處理,本次寫的**中頭節點不包含資料,僅作標記,所以這條可以不考慮,但如果頭節點不是標記包含資料就需要考慮);

**:

//刪除某個結點

void

deletenode

(node *phead, node *todelnode)

else

node-

>next =

null

;delete todelnode;

todelnode =

null;}

}

///

///題目:刪除單向鍊錶中的某個結點,時間複雜度要求為o(1)

///// 頭結點不包含資料,只做乙個標記

#include

using

namespace std;

typedef

struct node

node;

//新增結點

node *

addnewnode

(node *phead,

int newvalue)

;//列印鍊錶

void

printnodelist

(node *phead)

;//刪除某個結點

void

deletenode

(node *phead, node *todelnode)

;int

main()

//新增結點

node *

addnewnode

(node *phead,

int newvalue)

node *newnode =

newnode()

; newnode-

>value = newvalue;

newnode-

>next =

null

; node-

>next = newnode;

node =

null

;return newnode;

}//列印鍊錶

void

printnodelist

(node *phead)

cout << endl;

}

當待刪除結點是單項鍊表的最後乙個結點時,從頭節點開始找到待刪除結點的前乙個結點的時間複雜度是o(n),所以總的平均時間複雜度是[(n-1)xo(1)]/n,結果還是o(1)

題目二:刪除鍊錶中重複的結點

在乙個排序的單向鍊錶中,刪除鍊錶中存在重複值的結點。例如鍊錶:1->2->3->3->4->4->5,刪除重複的3和4後,鍊錶變為:1->2->5

分析:在遍歷鍊錶時,我們可以定義三個指標,分別指向當前結點、前乙個結點和後乙個結點。

**:

//刪除重複的結點

void

deleteduplicatenode

(node *phead)

if(todelete)

if(prenode ==

null

) prenode-

>next = nextnode;

node = nextnode;

}else

}}

int

main()

面試題18 刪除鍊錶的節點

給定單向鍊錶的頭指標和乙個要刪除的節點指標,定義乙個函式刪除該節點。思路 使用o 1 的方法來解決,將要刪除的的節點用下乙個節點來覆蓋就相當於是刪除了原節點。但有兩種特殊情況需要考慮,但鍊錶只有頭節點,即鍊錶只有乙個節點。二刪除的節點是尾節點,只用從頭for一遍 class listnode pub...

面試題18 刪除鍊錶的節點

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

面試題18 刪除鍊錶的節點

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