经典的面试问题:
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。
问题:
1、如何判断一个链表是不是这类链表?
2、如果链表为存在环,如果找到环的入口点?
Solution1:
用一个hash表(c++中可以用set)保存遍历过的指针,每前进一步查看是不是hash表中存在,如果存在,证明有环,并且第一个存在的就是环的入口地址。
Solution2:
快指针,慢指针方案。定义两个指针,一个快指针,每次走一步,慢指针,每两次走一步,这样如果有环,两者肯定能相遇,否则,快指针会走到尾部。(这种方案判断入口点比较麻烦)
Solution3:
反转链表方案。每走一步,将指针反转指向前面的节点,这样如果有环的话,最终会走到头指针,否则会走到尾部(判断是否NULL)。最后还要将原链表反转回来。