【LeetCode 30天挑战活动】Day 8. Middle of the Linked List

题目描述

找到一个链表的中间节点
如果中间节点有两个,取右边的那个

解法

核心思想:快慢指针找中点
使用两个指针,慢指针每次前进一个节点,快指针每次前进两个节点,当快指针指向链表末尾时,慢指针正好指向中点
(之前有一个快慢指针找循环,这里有一个快慢指针找中点,快慢指针可真好用)
code如下:

class Solution {
    public ListNode middleNode(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        
        ListNode slow = head;
        ListNode fast = head;
        
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next;
            fast = fast.next;
        }
        
        return slow;
    }
}

拓展

同样是一道链表题,给定链表head和一个整数n,链表长度未知,要求返回链表中间的n个节点
例如:
有链表1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9,给定n = 3,则需要返回节点[4, 5, 6]

快慢指针的思路也可以应用于这一题,只是慢指针行为稍作改变。在快指针进行移动的同时,慢指针并非从一开始就跟着移动,而是要等到快指针移动的距离超过了n / 2之后才开始移动

    public List<Node> getNnodes(Node head, int n) {
        if (head == null || n <= 0) {
            return new ArrayList<Node>(0);
        }

        Node slow = head;
        Node fast = head;

        int len = 1;

        while (fast != null && fast.next != null) {
            if (len > (n / 2)) {
                slow = slow.next;
            }
            len += 2;
            fast = fast.next;
            fast = fast.next;
        }

        if (fast == null) {
            len++;
        }

		// capacity的作用是解决n比链表长度更大时的问题
        int capacity = Math.min(len, n);
        List<Node> res = new ArrayList<>(capacity);

        for (int i = 0; i < capacity; ++i) {
            res.add(slow);
            slow = slow.next;
        }

        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值