本次写的题目是链表的中间结点,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎
🌱分析阶段
这是一道很经典的题目,我们需要用到一个小技巧:快慢结点
快慢结点:该技巧有多种使用情况,在本题目中即为创建两个结点,一个只是一步一步地走,另一个结点则两步两步地走,依次达到快的那个结点走到链表末的时候,慢结点刚好到达链表中间位置
我们将快结点用quick表示,慢结点就用cur表示,图示如下👇:
📢总结:要得到中间结点,我们只需要像上面的两张图一样,创建一个快结点和一个慢结点,之后快结点两步两步走,慢结点一步一步走,等到快结点走到null位置或者快结点的next域为null的时候,此时的慢结点的位置就是中间结点的位置。
🌱代码阶段
在写代码的时候,我们有了上面总结的普遍情况的解决方法后,要再先思考有无特殊情况,本题由于要用到快结点,所以我们要判断会不会该链表有 头结点为null 或 该链表只有一个结点的情况出现 ,至此,先写出下面的特殊情况下的代码👇:
class Solution {
public ListNode middleNode(ListNode head) {
if(head==null) return null; //链表为空的时候,直接返回null
if(head.next==null) return head; //链表中只有一个结点的时候,该结点就为中间结点
}
}
接下来就是普遍情况下的代码编写,我们可以根据上面的总结来写出代码👇:
class Solution {
public ListNode middleNode(ListNode head) {
if(head==null) return null;
if(head.next==null) return head;
ListNode cur = head;
ListNode next = head;
while(next!=null&&next.next!=null){ //单数链表或双数链表的情况
cur = cur.next;
next = next.next.next;
}
return cur;
}
}
❗❗注意❗❗:在这里的代码中有一个地方要注意→while语句中的 next!=null 与 next.next!=null 位置不可以交换!!!否则会有空指针异常的风险
综上,便是全部代码,让我们来跑一下逝逝吧😎
nice😎✨
以上!便是全部的啦😎
又是收获满满的一天~