如何判斷乙個單鏈表是否有環

2021-07-05 19:38:21 字數 1432 閱讀 4245

題目要求:給定乙個單鏈表的頭指標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,則為無環鏈表 這樣就可以判斷兩個鍊錶是否...