題目:給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o(1)時間刪除該結點。鍊錶結點與函式的定義如下:
struct listnode
在單向鍊錶中刪除乙個結點,最常規的方法是從頭到尾掃瞄一遍找到結點,然後刪除結點。
對於給定的是值得結點,沒有辦法只能從頭到尾掃瞄乙個乙個對比值得大小,如果鍊錶中存在,則刪除結點。
本題給出的是乙個結點的指標,我們無需掃瞄就可以得到結點的指標,在這個過程中,只要把當前結點(p)的next結點(q)的值賦給當前結點,把q的next結點連線到p的next域刪,接下來刪除結點q就滿足題目的要求了。
但是這個題目中存在許多陷阱:首先是邊界條件的考慮,然後是刪除結點的位置,表頭,表尾,和中間,不同的地方刪除時處理不一樣。
下面給出,刪除函式
void deletenode(listnode** plisthead, listnode* ptobedeleted)
//要刪除的結點不是尾結點
if(ptobedeleted->m_pnext != null)
//鍊錶中只存在乙個結點,刪除頭結點
else if(*plisthead == ptobedeleted)
//鍊錶中有多個結點,刪除尾結點
else
pnode->m_pnext = null;
delete ptobedeleted;
ptobedeleted = null;
}}
面試題13 在O 1 時間刪除鍊錶結點
面試題13 題目 給定單向鍊錶的頭指標和乙個指標結點,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode void deletenode listnode plisthead,listnode ptobedeleted 常規的做法是從頭結點開始順序查詢到要...
面試題13 在O 1 時間刪除鍊錶結點
題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode void deletenode listnode plisthead,listnode ptobedeleted 刪除結點的操作我們經常碰到,比如乙個鍊錶a b ...
面試題13 在O 1 時間刪除鍊錶結點
題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 1 struct listnode 2 分析 如下圖所示,假設要刪除的結點為p結點,若直接刪除p結點,則必須知道p的上乙個結點,而查詢p的上乙個結點的時間複雜度為o n 可以交換p和p的下乙個結...