[英]Reduce the number of iteration when traversing in linked list in C
我有一個包含100個節點的單鏈列表。 我是否需要檢查此鏈接列表通告?
可以通過遍歷列表來實現,並且需要檢查等於頭的最后一個節點鏈接字段。
struct node *temp1, *temp2;
while(i != 100) {
temp2 = temp1->link;
if(temp2==head) {
printf("circular");
break;
else
temp1=temp1->link;
i++;
}
此方法最多需要100次迭代。 我想將其減少一半,我的意思是要經過50次迭代才能實現。
是否有可能做到這一點? 如果是,我們該怎么做?
要檢查循環鏈表,只需循環鏈表,對於每次迭代,請檢查以下內容:
if the head == temp->next than True, it does, than it's CircularLinkedList
else if temp->next == null than False
使用單個鏈接列表,您必須遍歷整個鏈接列表。 這也適用於循環鏈接列表。 否則人們為什么要進行這種ADT?
您可以使用雙重鏈接列表來檢查鏈接列表是否循環顯示。 您可以在固定時間內檢查它。
Tortoise and Hare算法可以滿足您的目的。
在每次迭代中,野兔都將穿過兩個節點,而烏龜則只有一個。 野兔將訪問每個節點,其中一些節點將多次訪問,但是如果將野兔的節點訪問總數除以2,結果將不會大於列表的長度。 烏龜也可能會訪問每個節點,但不會兩次訪問相同的節點。
該算法為O(n)
鏈接: http : //codingfreak.blogspot.com/2012/09/detecting-loop-in-singly-linked-list_22.html
因此,您可以進行50次迭代,並做一些改動。 保留另一個head( *head2
),它指向head->link
。 這仍將占用恆定的空間。 將其與if條件中的當前節點以及原始節點進行比較。 參見下面的代碼-
struct node *head, *head2, *temp;
temp = head; //assuming head points to start of the list
head2 = head->link;
while(i != 50) {
temp = temp->link->link;
if(temp==head || temp==head2) {
printf("circular");
break;
}
i++;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.