from:http://blog.youkuaiyun.com/woliuyunyicai/article/details/49687339
问题一、链表中倒数第k个结点
问题描述:
假定有一个链表a1->a2->.......->an->b1->.....->bn,想要将其重新排列成:a1->b1->a2->b2->.....an->bn,(假设链表长度是偶数个,但不知道链表的确切长度)
问题分析:
因为不知道链表的具体长度,因此需要遍历链表来确定链表长度;但没必要再遍历第二次去确定an和b1的分解线,即中间节点(因此这个问题的前一部分其实是查找链表的中间节点的问题)
采用双指针法,p1,p2分别从链表的头前节点出发,p1每步走1步,p2每步走2步;当p2走到尾节点bn时,p1此时走到的节点必然是an;(推广到链表长度为任意数的情况,p1最终仍然指向的中间节点或者中间节点中的一个)。
代码:
返回中间节点是 上述问题的其中一部分:
问题三、判断链表是否有环:
1、简单版:仅判断链表是否有环
问题分析:判断是否有环,依然采用快行指针法,使用p1,p2;p1走一步,p2走两步;若链表有环,则p1,p2一定会相遇;
证明:假设在行进过程中,p2跳过了p1,走到了位置i + 1上,此时p1所在位置为i(因为假设p2跳过了p1);则在前一步中p2所处的位置为(i + 1 - 2) = i - 1;而p1所处的位置也为i - 1,可见两者必然相遇,不会发生跳过的现象。
代码:
2、提高版:找到环的入口节点