判斷單鏈表是否有環(快慢指標)

2021-10-04 00:15:41 字數 1547 閱讀 2360

方法一:使用p、q兩個指標,p總是向前走,但q每次都從頭開始走,對於每個節點,看p走的步數是否和q一樣。如圖,當p從6走到3時,用了6步,此時若q從head出發,則只需兩步就到3,因而步數不等,出現矛盾,存在環。

方法二:使用p、q兩個指標,p每次向前走一步,q每次向前走兩步,若在某個時候p == q,則存在環。

#include

"stdio.h"

#define ok 1

#define error 0

#define true 1

#define false 0

typedef

int status;

/* status是函式的型別,其值是函式結果狀態**,如ok等 */

typedef

int elemtype;

/* elemtype型別根據實際情況而定,這裡假設為int */

typedef

struct node

node,

*linklist;

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

status initlist

(linklist *l)

/* 初始條件:順序線性表l已存在。操作結果:返回l中資料元素個數 */

intlistlength

(linklist l)

return i;

}/* 隨機產生n個元素的值,建立帶表頭結點的單鏈線性表l(頭插法) */

void

createlisthead

(linklist *l,

int n)

}/* 隨機產生n個元素的值,建立帶表頭結點的單鏈線性表l(尾插法) */

void

createlisttail

(linklist *l,

int n)

r->next =

(*l)

->next->next;

}// 比較步數的方法

inthasloop1

(linklist l)

} cur2 = cur2->next;

// 如果沒發現環,繼續下乙個結點

pos2++

;// cur2 步數自增

} cur1 = cur1->next;

// cur1繼續向後乙個結點

pos1++

;// cur1 步數自增

}return0;

}// 利用快慢指標的方法

inthasloop2

(linklist l)

return0;

}int

main()

else

printf

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

if(hasloop2

(l))

else

printf

("\n");

break

;case

'0':

exit(0

);}}

}

判斷單鏈表是否有環

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...

判斷單鏈表是否有環

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