[英]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++ 的以下方面:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.