題目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 輸入...