查看一个链表是否是有环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