單鏈表存在環的問題

2021-07-11 01:34:47 字數 1474 閱讀 7426

給定乙個單鏈表,只給出頭指標header

判斷鍊錶是否存在環

求環的長度

求環的連線點

求帶環鍊錶的長度

// 簡單的鍊錶定義及生成帶環鍊錶函式

typedef struct node node;

node* makenode()

typedef node* list;

node* constructcircle()

pnode->next = ptmpnode;

return header;

}

// 1 判斷鍊錶是否存在環

int iscircleexist(node *

header)

}return

0;}

能,fast指標步長可以選擇3、4或5等其他步長。

第二問證明:

假設單鏈表的總長度為l,頭結點到環入口的距離為a,環入口到快慢指標相遇的結點距離為x,環的長度為r,慢指標總共走了s步,則快指標走了2s步。另外,快指標要追上慢指標的話快指標至少要在環裡面轉了一圈多(假設轉了n圈加x的距離),得到以下關係:

s = a + x;

2s = a + nr + x;

=>a + x = nr;

=>a = nr - x;

由上式可知:若在頭結點和相遇結點分別設一指標,同步(單步)前進,則最後一定相遇在環入口結點。如下圖所示:

// 2 求環的長度

int circlelength(node *

header)

// 兩支針第二次相遇,則快指標比慢指標長走的長度剛好多一圈

if (meet ==

2) }

}return

0;}

// 3 求環的連線點

node* findcircleport(node *

header)

}if (fast ==

null

|| fast->next ==

null)

return

null;

slow =

header;

while (slow != fast)

return slow;

}

// 4 求帶環鍊錶的長度

int listlengthwithcircle(node *header)

len += circlelength(header);

return len;

}

判斷乙個單鏈表是否有環及環的鏈結

單鏈表是否存在環

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到null退出。2...

判斷單鏈表是否存在環,尋找單鏈錶環的入口

判斷單鏈表是否存在環,如果存在環,找出環的入口 有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如何找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fa...

判斷單鏈表是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...