【链表OJ题】:
本题来自于力扣算法题,链接:876. 链表的中间结点
题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
这道题目我们如何找到中间节点呢,我们不需要想成是一个编程题,我们可以想像一下如何找到一个赛道的中间位置,或者说是怎么不动不切这个赛道去找到中间位置,这可以用到我们以前学过的数理逻辑,如果小A跑步是5m/s,又有小B跑步是10m/s,那么这个B跑完,A是不是就是中间位置了。
这就用到我们编程中的一个概念:快慢指针。
也就是说,如果我们的一个指针(引用)每一次走过两个节点,另一个指针(引用)每一次走过一个节点,那么当走得快的指针找到null的时候,说明走得慢的指针就到中间位置了。
那么快慢指针有没有奇偶数之分呢,其实是有的,因为奇数刚好就一个中间节点,而偶数是两个相当于中间的节点,所以我们还有看一下奇偶数两种情况才好:
图示:
奇数情况下就很正常了,直接等到fast.next是null的值的时候,我们就可以得到慢指针的地方是中间节点了。
偶数的情况其实也可以,只不过它的判断方法要改为fast是null,因为偶数而且从第一个节点开始走,最后一步肯定是走到null,然后刚好慢指针找到了中间节点的第二个,符合题意。
那我们在开始写代码之前还有考虑一个链表的状态,是不是空链表。就可以写代码了:
参考代码:
class Solution {
public ListNode middleNode(ListNode head) {
if(head == null){//判断是否是空链表
return null;
}
ListNode fast = head;//快指针
ListNode slow = head;//慢指针
while(fast != null && fast.next != null){
//前面判断偶数情况 后面判断奇数情况
fast = fast.next.next;//走两步
slow = slow.next;//走一步
}
return slow;//返回慢指针(也就是中间节点)
}
}
这就是本题链表OJ题的详解了。