面試題18(一) 在O 1 時間刪除鍊錶結點

2022-06-01 19:24:08 字數 935 閱讀 7462

// 面試題18(一):在o(1)時間刪除鍊錶結點

// 題目:給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o(1)時間刪除該

// 結點。鍊錶結點與函式的定義如下:

// struct listnode;

// void deletenode(listnode** plisthead,listnode* ptobedeleted);

這是目前為止,唯一一道,我不看書就知道怎麼做的題。

正常從頭遍歷的話,很明顯時間複雜度是o(n),但是他把目標結點給出來了,這就好辦了。

直接用目標節點下乙個的m_nvalue覆蓋目標結點,然後刪除目標結點就好了。

開啟書一看,啊哈哈哈,果然是這個思路啊,就是作者考慮的比我周到多了。

首先,如果目標節點不是尾結點,直接用下乙個節點覆蓋目標節點,然後刪除下乙個結點。

如果目標節點就是尾結點(也是頭結點),刪除頭結點。

如果目標節點就是尾結點(不是頭結點,鍊錶有多個結點),那麼只能從頭結點開始遍歷了。

然後分析一下時間複雜度,乙個有n個結點的鍊錶,非尾結點有n-1個,直接刪除後邊的結點,時間複雜度為(n-1)*o(1)。

尾節點有乙個,時間複雜度為1*o(n),平均一下就是o(1),滿足題目的要求。

void deletenode(listnode** plisthead, listnode* ptobedeleted) 

//目標節點與頭結點重合,鍊錶只有乙個結點

else if (*plisthead == ptobedeleted)

//鍊錶有多個節點,且目標結點是尾節點

else

pnode->m_pnext = nullptr;

delete ptobedeleted;

ptobedeleted = nullptr;

} return;

}

面試題11 在O 1 時間刪除鍊錶結點

方法一 順序查詢要刪除的結點,並在鍊錶中刪除。時間複雜度為o n 不滿足題目要求 void deletenode listnode plisthead,listnode ptobedeleted else pcur m pnext ptobedeleted m pnext delete ptobed...

面試題13 在O 1 時間刪除鍊錶結點

題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode 在單向鍊錶中刪除乙個結點,最常規的方法是從頭到尾掃瞄一遍找到結點,然後刪除結點。對於給定的是值得結點,沒有辦法只能從頭到尾掃瞄乙個乙個對比值得大小,如果鍊錶中存在...

面試題13 在O 1 時間刪除鍊錶結點

面試題13 題目 給定單向鍊錶的頭指標和乙個指標結點,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode void deletenode listnode plisthead,listnode ptobedeleted 常規的做法是從頭結點開始順序查詢到要...