2023_华为OD机试真题_Java_002_单向链表中间节点

该博客介绍了如何使用快慢指针解决寻找单向链表中间节点的问题。通过快指针每次前进两步,慢指针每次前进一步,当快指针到达链表尾部时,慢指针即位于链表的中间位置。文章提供了解题思路、复杂度分析以及Java代码实现,旨在提高代码可读性。
摘要由CSDN通过智能技术生成

单向链表中间节点

题目描述

求单向链表中间的节点值,如果奇数个节点取中间,偶数个取偏右边的那个值。

输入描述

第一行 链表头节点地址 后续输入的节点数 n n n
后续输入每行表示一个节点,格式 节点地址 节点值 下一个节点地址(-1表示空指针)
输入保证链表不会出现环,并且可能存在一些节点不属于链表。

输出描述

单向链表中间的节点值

示例1

输入

00010 4
00000 3 -1
00010 5 12309
11451 6 00000
12309 7 11451

输出

6

示例2

输入

10000 3
76892 7 12309
12309 5 -1
10000 1 76892

输出

7

解题思路

本题可以使用快慢指针来解决。快指针每次走两步,慢指针每次走一步,当快指针到达链表尾部时,慢指针所指向的节点就是中间节点。我们还可以在代码中添加注释提高代码可读性。

复杂度分析

时间复杂度: O ( n ) O(n) O(n),其中 n n n 是链表节点个数,需要遍历整个链表一次。由于我们只对链表进行了一次遍历,因此时间复杂度是线性的。

空间复杂度: O ( 1 ) O(1) O(1),只需要常数的空间存储快慢指针。这里的空间复杂度不包括函数调用栈的空间,因为我们只使用了常数个变量。

由于本题解决方案比较简单,因此我们在代码中添加注释来提高代码可读性。同时,我们也可以在时间复杂度和空间复杂度分析中添加详细的解释,以更好地理解算法的性能。

参考解题Java

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String head = scanner.next();
        int n = scanner.nextInt();
        Node[] nodes = new Node[1000010];
        for (int i = 0; i < n; i++) {
            String address = scanner.next();
            int val = scanner.nextInt();
            String next = scanner.next();
            nodes[Integer.parseInt(address)] = new Node(address, val, next);
        }
        Node slow = nodes[Integer.parseInt(head)];
        Node fast = nodes[Integer.parseInt(head)];
        while (fast != null && fast.next != null) {
            slow = nodes[Integer.parseInt(slow.next)];
            fast = nodes[Integer.parseInt(nodes[Integer.parseInt(fast.next)].next)];
        }
        System.out.println(slow.val);
    }

    static class Node {
        String address;
        int val;
        String next;

        public Node(String address, int val, String next) {
            this.address = address;
            this.val = val;
            this.next = next;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值