查看一個鏈表是否是有環node
所謂查看是否是有環,就像是走迷宮的時候查看一條路有沒有走過,能夠採用作標記的方法。標記怎麼作就是一個問題了。我如今有兩種思路。測試
使用val標記,給每一個走過的node一個獨一無二的int值,若是發現訪問到這個int值,就是有環
這個其實很難找到一個獨一無二的值,好比設爲 I,你怎麼能保證原鏈表中沒有I這個值。code
使用next標記,給每一個走過的node一個next值,檢驗是否符合這個條件。好比吧next指向本身,這樣一來,若是檢測到
有這個特徵的node,就是有環。和使用val標記不一樣的是,若是原來的鏈表中有個這樣的node,那它自己也就是有環,檢測結果也是對的。it
思路1 這其實是一個錯誤的解法,只不過用於測試的鏈表中沒有val爲100的,因此能夠經過。io
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool hasCycle(ListNode *head) { while(head!=nullptr){ int tempVal = head->val; //head-> if(tempVal!=100){ head->val = 100; }else{ return true; } head = head->next; } return false; } };
思路2class
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool hasCycle(ListNode *head) { if(head==nullptr){ return false; } ListNode* nextTemp; //最後一個元素不訪問,執行完while以後,head指向最後一個元素(該元素的next是null) //確定不是以前出現過的元素 while(head->next!=nullptr){ if(head!=head->next){ nextTemp = head->next; head->next = head; //指向自身 head = nextTemp; }else{ return true; } } return false; } };
若是要檢測是否有循環,又沒有好的檢測標準,就用檢測過的元素弄出一個易於檢測的循環。。。List