刪除單鏈表節點O 1

2021-07-03 17:50:42 字數 1102 閱讀 3159

一,題目

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

struct listnode

;

函式的宣告如下:

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

二,分析

這是一道廣為流傳的google面試題,能有效考察我們的程式設計基本功,還能考察我們的反應速度,更重要的是,還能考察我們對時間複雜度的理解。

在鍊錶中刪除乙個結點,最常規的做法是從鍊錶的頭結點開始,順序查詢要刪除的結點,找到之後再刪除。由於需要順序查詢,時間複雜度自然就是o(n)了。我們之所以需要從頭結點開始查詢要刪除的結點,是因為我們需要得到要刪除的結點的前面乙個結點。

「狸貓換太子法」:可以從給定要刪除的結點得到它的下乙個結點。這個時候我們實際刪除的是它的下乙個結點,在刪除之前,我們需要需要把給定的結點的下乙個結點的資料拷貝到給定的結點中,然後刪除該節點的下乙個節點。此時,時間複雜度為o(1)。

上面的思路還有乙個問題:如果刪除的結點位於鍊錶的尾部,沒有下乙個結點,怎麼辦?我們仍然從鍊錶的頭結點開始,順便遍歷得到給定結點的前序結點,並完成刪除操作。這個時候時間複雜度是o(n)。

那題目要求我們需要在o(1)時間完成刪除操作,我們的演算法是不是不符合要求?實際上,假設鍊錶總共有n個結點,我們的演算法在n-1總情況下時間複雜度是o(1),只有當給定的結點處於鍊錶末尾的時候,時間複雜度為o(n)。那麼平均時間複雜度[(n-1)*o(1)+o(n)]/n,仍然為o(1)。

#include

using namespace std;

struct node

;node *creat()

return head;

} node *findlastnode(node *head,int data)

return head;

} void deletenode(node *head,node *del)

else

} void print(node *head) }

int main()

在時間複雜度O 1 內刪除單鏈表節點

題目 給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o 1 時間內刪除該節點。鍊錶節點定義如下 public class listnode分析 有三種情況 要刪除的節點不是尾節點,時間複雜度為o 1 單鏈表中只有乙個節點,刪除頭節點,時間複雜度為o 1 單鏈表中有多個節點,要刪除的為尾節點,時間...

在O 1 時間刪除單鏈表結點

出處 題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。原文採用的是c c 這裡採用c 節點定義如下 public class node 指標域 public nodenext publicnode publicnode t item 要實現的deletenode方法定...

用O 1 的時間複雜度刪除單鏈表中的某個節點

給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。鍊錶結點的定義如下 definition for singly linked list.public class listnode 函式的宣告如下 void deletenode listnode plisthead,listnode pto...