給定乙個單鏈表,只給出頭指標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每次前進...