美文网首页LeetCode数据结构与算法
876. 链表的中间结点 思路:快慢指针

876. 链表的中间结点 思路:快慢指针

作者: 游龙飞雪 | 来源:发表于2020-12-04 12:48 被阅读0次

876. 链表的中间结点 思路:快慢指针

解题思路

如果先遍历再查找中间节点,那么随着数据量增大将非常消耗性能!
利用快慢指针非常巧妙,类似使用取模方式之巧妙!2倍则利用2倍快指针,3的倍数则利用3倍快指针,以此类推。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        // head为空或者只有1个、2个节点的情况都包含在内
        ListNode fast = head, slow = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

        return slow;
    }
}

测试用例


    // 测试用例
    public void test() {
        int arr1[] = {1};
        test(arr1);

        int arr2[] = {1, 2};
        test(arr2);

        int arr3[] = {1, 2, 3};
        test(arr3);

        int arr4[] = {1, 2, 3, 4};
        test(arr4);

        int arr5[] = {1, 2, 3, 4, 5};
        test(arr5);

        int arr6[] = {1, 2, 3, 4, 5, 6};
        test(arr6);

        int arr7[] = {1, 2, 3, 4, 5, 6, 7};
        test(arr7);

        test(null);
    }

    public void test(int arr[]) {
        ListNode head = arr == null ? null : new ListNode(arr);
        System.out.println("组合完成:" + (head == null ? "【null】" : head.toLinkedString()));

        ListNode midd = middleNode(head);
        System.out.println("\t--中间元素:" + (midd == null ? "null" : midd.toLinkedString()));
    }

    public static void main(String args[]) {
        new _006_876_链表的中间结点().test();
    }

    /*
    组合完成:ListNode: 【1】
        中间元素:ListNode: 【1】

    组合完成:ListNode: 【1->2】
        中间元素:ListNode: 【2】

    组合完成:ListNode: 【1->2->3】
        中间元素:ListNode: 【2->3】

    组合完成:ListNode: 【1->2->3->4】
        中间元素:ListNode: 【3->4】
    
    组合完成:ListNode: 【1->2->3->4->5】
        中间元素:ListNode: 【3->4->5】
    
    组合完成:ListNode: 【1->2->3->4->5->6】
        中间元素:ListNode: 【4->5->6】

    组合完成:ListNode: 【1->2->3->4->5->6->7】
        中间元素:ListNode: 【4->5->6->7】

    组合完成:【null】
        中间元素:null
*/

相关文章

  • [Leetcode] 876. 链表的中间结点

    876. 链表的中间结点 来源: 876. 链表的中间结点 1. 解题思路 利用快慢指针 2. 代码

  • 876. 链表的中间结点 思路:快慢指针

    876. 链表的中间结点 思路:快慢指针 解题思路 如果先遍历再查找中间节点,那么随着数据量增大将非常消耗性能!利...

  • 234. 回文链表

    一. 题目: 二. 思路: 快慢指针找到中间结点,反转中间结点以后的链表 拿反转之后的链表和前面链表进行比较,如果...

  • 0876-链表的中间结点

    链表的中间结点 方案一 使用快慢指针 借助单链表实现 C-源代码

  • LeetCode 876. 链表的中间结点

    876. 链表的中间结点 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返...

  • LeetCode 链表 > 876. 链表的中间结点

    876.链表的中间结点给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第...

  • 双指针

    一、双指针总结 1.1题目 快慢指针(主要解决链表中的问题) 141.环形链表 142.环形链表 II 876.链...

  • 23_链表中倒数第k个节点

    要求:输入一个链表,输出该链表中倒数第k个结点。思路:使用快慢(双)指针,准备两个指针A和B,A指针指向头结点,A...

  • Leetcode234-回文链表(2019 408源题)

    题目:Leetcode234 解答: 基本思路:快慢指针找到中间结点+反转后半部分的链表 方法一: 时间复杂度:n...

  • 快慢指针寻找链表中间结点

    声明: 转载文字或图片请在文首注明出处,3Q. 原理: 我们设置两个指针 slow 和 fast, slow 每...

网友评论

    本文标题:876. 链表的中间结点 思路:快慢指针

    本文链接:https://www.haomeiwen.com/subject/nkabwktx.html