题目描述如下:
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。
解题思路:
第一步:定义快慢指针
定义一个快指针和一个慢指针从头开始遍历
让快的指针每次走两步,让慢的指针每次走一步,
当快的指针走完时,慢的指针刚好走到中间节点
我们知其然 也要知其所以然.
所以这是为什么呢?
因为快的指针的速度是慢的指针的2倍,所以快的指针遍历完时,刚好慢的指针走到中间
步骤如下:
定义一个快指针:fast
ListNode fast = head;
定义一个慢指针slow
ListNode slow = head;
使用一个while循环来遍历链表,结束条件是
fast != null && fast.next != null
注意事项:
这个顺序不可以写反了,否则会出现空指针异常
以下这个写法会出现空指针异常的情况…
fast.next != null && fast != null
具体细节:
那么快的指针如何走两步呢?
聪明的你一定已经想到啦~~
fast = fast.next.next;
慢的指针如何走一步呢?
slow = slow.next;
最后我们再把找到的中间节点返回即可
return slow;
完整代码如下:
public ListNode Middle(ListNode head){
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
该题目在力扣网上的链表的中间节点
快去试试吧~