求单向链表的中间结点

简介: #### 需求非空的单向链表,返回其中间节点。如果有两个中间结点,返回第二个。链表大小控制在1~100之间。

求单向链表的中间结点

需求

非空的单向链表,返回其中间节点。如果有两个中间结点,返回第二个。
链表大小控制在1~100之间。

示例1:

Input: [1,2,3,4,5]
Output: Node 3 from this list (Serialization: [3,4,5])

示例2:

Input: [1,2,3,4,5,6]
Output: Node 4 from this list (Serialization: [4,5,6])

方法一:使用数组实现

循环遍历链表,统计链表长度,同时将每个结点存储数组中,最后返回数组中角标为(链表长度/2)的结点即可。

    /**
     * 求单向链表的中间结点,使用数组实现
     * @param head
     * @return
     */
    public SingleNode middleNodeByArrays(SingleNode head) {
        SingleNode[] arrays = new SingleNode[100];
        int count = 0;
        while (head != null) {
            arrays[count] = head;
            count++;
            head = head.next;
        }
        return arrays[count / 2];
    }

测试代码:

        // 求单向链表的中间结点
        SingleLinkedList sll1 = new SingleLinkedList();
        for (int i = 1; i < 10; i++) {
            SingleNode node = new SingleNode(i, null);
            sll1.add(node);
        }
        System.out.println(sll1.toString());

        SingleNode node1 = middleNodeByArrays(sll1.getFirst());
        sll1.logFromHead("middleNodeByArrays1", node1);

        SingleLinkedList sll2 = new SingleLinkedList();
        for (int i = 1; i < 11; i++) {
            SingleNode node = new SingleNode(i, null);
            sll2.add(node);
        }
        System.out.println(sll2.toString());

        SingleNode node2 = middleNodeByArrays(sll2.getFirst());
        sll2.logFromHead("middleNodeByArrays2", node2);

输出结果:符合预期。

    SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9]
    middleNodeByArrays1:[5, 6, 7, 8, 9]
    SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    middleNodeByArrays2:[6, 7, 8, 9, 10]

方法二:使用快慢指针

定义两个指针slow和fast,slow每次移动一步,fast每次移动两步,这样当fast尾结点的时候,slow一定位于链表的中间结点上。
代码如下:

    /**
     * 求单向链表的中间结点,使用快慢指针实现
     * @param head
     * @return
     */
    public SingleNode middleNodeByTwoPointers(SingleNode head) {
        SingleNode slow = head;
        SingleNode fast = head;

        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

测试代码如下:

         // 求单向链表的中间结点
        SingleLinkedList sll1 = new SingleLinkedList();
        for (int i = 1; i < 10; i++) {
            SingleNode node = new SingleNode(i, null);
            sll1.add(node);
        }
        System.out.println(sll1.toString());

        SingleNode node1 = middleNodeByTwoPointers(sll1.getFirst());
        sll1.logFromHead("middleNodeByTwoPointers1", node1);

        SingleLinkedList sll2 = new SingleLinkedList();
        for (int i = 1; i < 11; i++) {
            SingleNode node = new SingleNode(i, null);
            sll2.add(node);
        }
        System.out.println(sll2.toString());
        SingleNode node2 = middleNodeByTwoPointers(sll2.getFirst());
        sll2.logFromHead("middleNodeByTwoPointers2", node2);

输出结果如下:符合预期

    SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9]
    middleNodeByTwoPointers1:[5, 6, 7, 8, 9]
    SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    middleNodeByTwoPointers2:[6, 7, 8, 9, 10]

完整代码请查看

项目中搜索SingleLinkedList即可。

github传送门 https://github.com/tinyvampirepudge/DataStructureDemo

gitee传送门 https://gitee.com/tinytongtong/DataStructureDemo

参考:
1、middle-of-the-linked-list

2、使用Java实现单向链表,并完成链表反转。

相关文章
|
3月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
80 1
|
2月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
25 1
|
4月前
链表的中间结点
链表的中间结点
183 57
|
3月前
|
存储
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(一)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
3月前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
32 0
|
3月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
19 0
|
3月前
|
存储 缓存
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(二)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
5月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
6月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
42 1
【数据结构OJ题】链表中倒数第k个结点
|
5月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点

热门文章

最新文章