簡體   English   中英

"單鏈表時間"

[英]Singly Linked List Time

給定一個單鏈表,其中包含一個指向頭部的指針和一個指向尾部的指針。 哪個最耗時?

  • 在開頭插入節點

  • 在末尾插入節點

  • 在開頭刪除節點

  • 最后刪除節點

我認為在最后插入節點,因為要這樣做,我們必須遍歷整個鏈表,然后插入節點的數據,然后相應地鏈接節點。

但是,通過我所做的研究,最后刪除節點似乎也是一個有效的選擇,你會說哪個需要最多的時間?

最后刪除節點:需要遍歷所有鏈表,因為它需要更新倒數第二個節點以將下一個指針更新為NULL。

讓我們看看每個人需要什么

在開始處插入節點:恆定時間

inserted.next = head
head = inserted

最后插入節點:恆定時間

tail.next = inserted
tail = inserted

開始刪除節點:恆定時間

old_head = head
head = head.next
delete old_head

最后刪除節點:線性時間<--最昂貴

old_tail = tail
new_tail = head
while new_tail.next is not None:
    new_tail = new_tail.next
tail = new_tail
delete old_tail

分析這里的復雜性。

假設列表結構如下

node1->node2->node3->node4->node5

頭-------------------------------------尾巴

在末尾插入節點:tail-> next = newNode; O(1)

刪除節點結束:沒有尾部的 prev 指針(因為它是單鏈表)所以必須遍歷整個列表以找到第二個節點。 在)

secondlast_node->next = Null;
free(tail);
tail = secondlast_node;

(如果您設法以不同的方式構建列表,答案可能會改變)

如果您已經按照以下示例構建了鏈表

節點1<-節點2<-節點3<-節點4<-節點5

頭 - - - - - - - - - - - - - - - - - - - - - - - - - - 尾巴

一開始刪除節點成為最昂貴的操作

但在這兩種情況下,最后插入節點都是 O(1) 復雜度

取決於你的指針在哪里。如果它在開頭,它將在最后一個節點插入和刪除。

如果您有兩個指向頭和尾的指針 1. 插入:都將 O(1) 視為只是修改頭和尾指針。 2. 刪除:頭側刪除需要 O(1) 時間,但是尾需要前一個指針,需要 O(n) 時間復雜度。

假設:它是單鏈表。 對於 DLL 都需要 O(1)

案例研究:鏈表是一種線性數據結構,其中元素不存儲在連續的內存位置。 鏈表中的元素使用指針鏈接,如下圖所示: 鏈接中的每個元素稱為一個節點,它由兩部分組成: a. 節點存儲的數據 b. 鏈接指向鏈表中的下一個節點 在此評估 2 中,您需要在 Visual Studio 中開發一個名為 LinkedList.cpp 的鏈表,它使用鏈表將瀏覽歷史存儲在 Web 瀏覽器中,使用 C++ 的以下方面:

  1. 鏈表中具有適當數據類型的節點:每個節點存儲在 URL(網址)中,它在鏈表中的當前位置(索引)以及鏈接到鏈表中的下一個節點。
  2. 插入 - 在行列列表的開頭添加一個節點:方法簽名是 void insertFirst(String newURL)
  3. 刪除 - 刪除鏈表開頭的節點:方法簽名是 void deleteFirst()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM