簡體   English   中英

減少在C中的鏈表中遍歷時的迭代次數

[英]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.

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