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

2021-07-03 13:02:17 字數 724 閱讀 1102

/*面試題13

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

struct listnode

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

常規的做法是從頭結點開始順序查詢到要刪除的結點,並在鍊錶中刪除該結點。這種思路的時間複雜度是o(n)。

對於n-1個非尾結點,可以在o(1)內把下乙個結點的記憶體複製到要刪除的結點,並刪除下乙個結點;對於尾結點而言,仍然需要順序查詢,時間複雜度是o(n)。因此

總的時間複雜度是((n-1)*o(1)+o(n))/n,結果還是o(1)。

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

// 鍊錶只有乙個結點,刪除頭結點(也是尾結點)

else if(* plisthead==ptobedeleted)

// 鍊錶中有多個結點,刪除尾結點

else }

//上述**存在乙個假設就是要刪除的結點在鍊錶中。判斷鍊錶中是否包含某個結點需要o(n)的時間。這就超出了題目的要求,可以和面試官討論這個假設。

//測試用例包括:功能測試(刪除頭結點,尾結點,中間結點,刪除唯一結點),特殊輸入測試(頭結點為null,指向要刪除的結點為null指標)。

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

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

面試題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的下乙個結...