題目要求:給定乙個單鏈表的頭指標head,要求寫乙個函式判斷這個單鏈表是否是乙個有環單鏈表。
單鏈表中的節點定義如下:
struct listnode
;方法1:首先定義乙個mapmap,然後從單鏈表的頭指標開始往後遍歷,每次遇到乙個指標p,就判斷map[pcur]是否為0,若為0,則將map[pcur]賦值為1,表示該節點是頭一次訪問;如果map[pcur]的值為2,則說明這個節點已經被訪問過一次了,說明這個單鏈表中是存在乙個環的。
方法2:定義兩個指標fast和slow,slow初始值為head,fast的初始值為head->next,fast每次前進2步,slow每次前進1步,兩個指標是同時向後移動的,當快慢指標相遇了,表示單鏈表中是有環的,否則的話就表示單鏈表無環。
**如下:
#include
#include
#include
using namespace std;
struct listnode
;// 方法1
listnode *isloop1(listnode *head)
listnode *pcur = head;
mapmap;
while(pcur != null)
else if(map[pcur] == 1)
pcur = pcur->next;}}
// 方法2
listnode *isloop2(listnode *head)
while (fast != null)
// fast每次前進2步
fast = fast->next;
fast = fast->next;
// slow每次前進1步
slow = slow->next;
}return null;
}int main()
listnode *tail = cur;
cur = head;
n = 0;
while(++n <= 5)
// 將單鏈表的環入口定義為節點值為5的節點
tail->next = cur;
// 呼叫方法1的函式isloop1尋找環入口
listnode *result = isloop1(head);
cout << "單鏈表的環入口值為:" << result->val << endl;
// 呼叫方法2的函式isloop2尋找環入口
result = isloop1(head);
cout << "單鏈表的環入口值為:" << result->val << endl;
return 0;
}
程式執行如下圖所示:
判斷乙個單鏈表是否有環
一 判斷鍊錶是否存在環 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入 環,而slow後進入環,兩個指標必定相遇。當然,fast先行頭到尾部為null,則為無環鏈表 程式如下 bool i itsloop listn...
判斷乙個單鏈表是否有環及環
判斷乙個單鏈表是否有環及環的鏈結點 蒙恩的罪人 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩...
判斷乙個單鏈表中是否有環
一 題目 判斷乙個單鏈表中是否存在環。二 解法 設定兩個工作指標slow和fast,初始值都指向群頭節點,slow每次前進一步,fast每次前進兩步,如果鍊錶中存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fast遍歷到null,則為無環鏈表 這樣就可以判斷兩個鍊錶是否...