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

2022-03-06 16:42:53 字數 1139 閱讀 3703

題目:給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o(1

)時間刪除該結點。

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

struct

listnode

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

刪除結點的操作我們經常碰到,比如乙個鍊錶a->b->c->d->e->f->g。如果我們要刪除結點e,那麼我們只需要讓結點d的指標指向結點f即可,但是我們現在只給出煉表頭結點的指標以及結點e的指標,而又是單項鍊表,不能在o(1)時間內得到被刪除結點前面的那乙個結點的指標,所以我們原先的方法是不能在o(1)時間內刪除結點e的。

那麼既然我們不能獲得被刪除結點的前乙個結點的指標,我們就需要轉變思路來考慮是否能夠用過被刪除結點後乙個結點的指標來解決方法。因此被刪除結點e的後乙個結點指標是很容易得到的,也就是e->m_pnext。

view code

#include#include

#include

using

namespace

std;

//鍊錶結構

struct

listnode;//

建立乙個鍊錶結點

listnode* createlistnode(int

value)

//遍歷鍊錶中的所有結點

void printlist(listnode*phead)

cout

<

}void connectlistnode(listnode* pcurrent,listnode* pnext)//

連線兩個結點

else

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

else

if(*plisthead==ptobedeleted)//

如果鍊錶只有乙個結點

else

//如果鍊錶有多個結點,且刪除最後乙個結點,那麼只能遍歷鍊錶

}void

main()

輸出結果:

1 2 3 4 5 6 7

1 2 4 5 6 7

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

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

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

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

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

題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 1 struct listnode 2 分析 如下圖所示,假設要刪除的結點為p結點,若直接刪除p結點,則必須知道p的上乙個結點,而查詢p的上乙個結點的時間複雜度為o n 可以交換p和p的下乙個結...