怎么判断单链表是否存在环形链表问题

单链表存在环的问题,也就是说明,某个节点的next指针指向的是在它前面的节点。方法有好多种

1.假设存在两个指针*a,*b都指向链表的头结点,每循环判断一次,a向前走一步,b向前走两步。那么如果这样算下去,总有一个有限循环内,b会到达NULL指针或者b和a相等。此时停止循环。

bool findLoop(node *head)

{

node *a=head;

node *b=head;

 if(head==NULL||head->next=NULL)

{

return false;

}

do{

  a=a->next;

  b=b->next->next;

}while(a!=b&&b&&b->next);

if(a==b)

return true;

else

return false;

}这个答案算是比较靠谱的答案,但很难准确把握算法的时间复杂度,写完随笔后又想了想,这的确不是一个好答案。

 

2.可以循环遍历单链表,对走过的节点进行标记,数据成员全部初始化为0,然后开始遍历,给数据层编辑数字,0,1,2,3,4,5,……如果当前节点为19,则下个节点为20或者不存在,如果下个节点存在且不为20,则说明链表存在环起始环节点为第20个节点,为了保证链表中数据的完整性,可采用值传递或者const &a形式的传递方式,保证链表的安全性。

第二种方法从一定程度上来说保证了算法的效率,但为链表数据部分归零时很难保证能够全部初始化完毕或者无重复,想了想还是用另一种方法,不知道对不对。

 

3.把节点存放的地址读取出来,存放进哈希表中,指针后移直到指针指向NULL或者发现哈希表中有地址重复的地方停止,如果发现重复地址,则该指针即为环的出口地址。

(如果链表足够长的话,对哈希表的要求又比较高,所以哪个是最优的很难说。如果碰到面试题目的时候,用第一种方法就可以了)

 

 

posted @ 2014-04-06 15:46  Lora_wen  阅读(3325)  评论(0编辑  收藏  举报