链表的中间节点

写这一篇博客的原因是因为后续很多内容需要用到反转链表。
该题的链接在这里
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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值