要求:只用一次遍历找到“2”
思路:双指针
定义fast指针和 slow指针都指向head节点,每次遍历slow指针向后移动一步,fast向后移动两步,当fast指针走到最后(两种情况,一种是刚好走到链表最后一个节点,一种是倒数第二个节点,这两种情况在下面都会说),slow指针就会指向当前链表的中间节点
步骤:
1.定义fast指针和 slow指针都指向head节点
2.第一次遍历,fast向后移动两个,slow移动一个
3.第二次遍历
4.第三次遍历
5.第四次遍历,此时fast节点已经不能再往后遍历,slow节点就是我们要的答案
可以看出如果加上head节点后的节点数量是奇数的话,fast节点会刚好在最后一个节点,如果删除掉一个节点使总的节点数变成偶数的话我们再来看下效果
可以看出在fast指向3的时候虽然后面还有一个节点,但是由于fast每次要跳两个节点,所以对于fast而言已经不能接着往下走,此时slow指向的4就是我们要的结果
代码实现:
//找到链表的中间值
public Node findMid() {
//定义快指针fast
Node fast = head;
//定义慢指针slow
Node slow = head;
while ((fast != null)&&(fast.next!=null)) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}