Linked List Cycle

来源:互联网 发布:长江交易软件下载 编辑:程序博客网 时间:2024/06/11 05:21

基本思想是要能够知道哪些节点是已经访问过的,这样如果再次访问已经访问过的节点,就是存在环的证明。如果用naive的想法,我们可以用一个set来记录已经访问过的节点,每当访问一个新的节点时,去查看是否已经存在于set中即可,这样平均需要消耗额外O(N)的空间。

如果想要省去这部分额外开销,必须从节点本身来考虑,能够改变节点的某些“特质”,使得我们能够认出已经访问过的节点。改变无非发生在两个地方,val或者next指针。经过思考。我们发现next指针是一个比较好的切入点(因为我们不能对list中节点所代表的值做任何假设),比较naive的想法是将访问过的节点的next指针设置为NULL,但稍作分析即可以发现,这样做我们无法和list无环的情况区分开,因为无环时最后一个节点的下一个节点本身就是NULL,所以我们要额外搞一个tag节点出来。


/** * 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) {        ListNode* tag=new ListNode(0);        while(head)        {            if((head->next)&&(head->next==tag))            {                return true;            }            ListNode* tmp=head;            head=head->next;            tmp->next=tag;        }        return false;            }};


0 0
原创粉丝点击