写这一篇博客的原因是因为后续很多内容需要用到反转链表。
该题的链接在这里
leetcode:链表的中间节点
一丶讨论
其实在这一部分一般情况下我们都会定义这样两个
ListNode fast = head;//定义快指针
ListNode slow = head;//定义慢指针
来进行操作。
具体思路是快指针每次走两步,慢指针每次走一步,然后当快节点走到头的时候,慢节点恰好是中间位置。
PS:此处思路单单只是针对于:快指针.next不等于空 来讨论 ,你也可以用:快指针不等于空来进行讨论,看个人,都不影响的。
1.关于链表节点为奇数和偶数
什么意思呢?
针对上面这两种情况,第一种:节点个数为奇数个,一切都是那么的刚刚好,fast.next == null 时循环刚好结束,slow指针恰好是中间节点。
第二种:就有点搞人心态,因为你会发现快指针根本走不到两步,只走一步的时候他下一步就没地方走了。
这里特别提醒:我这里用的是 fast.next != null,就算你用fast != null 来进行判断的时候也会出现这个情况,只不过它不是偶数节点出现问题,而是奇数节点。
2.关于偶数节点返回前后节点的问题
这里啥意思,偶数节点中间节点是两个。
在后面会有一道算法题,需要从中间断开链表!这个时候是不是要返回第一个节点的位置,但是这道题呢?它要我们返回第二个节点的位置,所以这个时候又要分情况讨论。
在这里我们主要是针对这个算法题来进行讨论,所以只需要返回第二个节点就好啦。
二丶双指针
就是定义一个快指针,一个慢指针,具体代码如下:
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;//定义快指针
ListNode slow = head;//定义慢指针
while(null != fast.next){//确保快指针临界条件为最后一个节点
if(fast.next.next == null){//这里就是判断了,如果快指针只能走一步咋办
fast = fast.next;
slow = slow.next;//如果返回前一个节点就去掉这行代码
continue;//这个时候直接跳出此次循环
}
//以下就是正常的操作了
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
三丶用数组的方式
class Solution {
public ListNode middleNode(ListNode head) {
List<ListNode> list = new ArrayList();
while(head != null){
list.add(head);
head = head.next;
}
return list.get(list.size() / 2);
}
}