判斷單鏈表中是否有環

2021-07-25 03:20:41 字數 1214 閱讀 8674

#define _crt_secure_no_deprecate

#include #include #include#include #define ok 1

#define error 0

#define true 1

#define false 0

typedef int status;//函式結果狀態**,如ok。

typedef int elemtype;

typedef struct node

node, *linklist;

//初始化帶頭結點的空鍊錶

status initlist(linklist *l)

(*l)->next = null;//指標域為空

return ok;

}//返回l中元素個數

int listlength(linklist l)

return i;

}//頭插法建立有頭結點的單鏈表

void createlisthhead(linklist *l, int n)

}//尾插法建立有頭結點的單鏈表

void createlisttail(linklist *l, int n)

r->next = (*l)->next->next;

}//比較步數的方法

int hasloop1(linklist l)

//在相同結點,步數不同,代表有環

else

}cur2 = cur2->next;//沒有發現環,繼續下乙個結點

pos2++;

}cur1 = cur1->next;//cur1向後乙個節點

pos1++;

}return 0;

}//利用快慢指標法

int hasloop2(linklist l)

printf("p:%d,q:%d \n", p->data, q->data);

if (p == q)

}return 0;

}int main()

else

printf("方法二:\n\n");

if (hasloop2(l))

else

printf("\n\n");

break;

case'0':

exit(0);}}

}

判斷單鏈表中是否有環

單鏈表中的迴圈鍊錶尾結點不一定指向頭結點,也可以指向任意中間結點。此時若想判斷單鏈表中是否有環,就不能只是簡單的根據尾結點的next是不是頭結點來判斷,在此我提供三種方法 方法一 建立兩個指標p和q,其中p用來遍歷指標,每次只走一步,並記錄從根節點出發所走的步數,而q則是每次從根節點出發,到達p此時...

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷單鏈表是否有環

鍊錶結構 struct list 1 判斷單鏈表是否有環 採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。如下 判斷鍊錶是否有環,時間複雜度o n 空間複雜度o 1 list hasloopinlist list head else...