博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法 | Leetcode 876. middle-of-the-linked-list
阅读量:6278 次
发布时间:2019-06-22

本文共 2394 字,大约阅读时间需要 7 分钟。

原文链接:

前面,我们实现了 操作,本篇来聊聊,如何求一个链表的中间节点。

求链表的中间结点

给定一个非空的单链表,要求返回它的中间节点,如果中间节点有两个则返回第二个。

例如:

Input: [1,2,3,4,5]Output: Node 3 from this list 复制代码
Input: [1,2,3,4,5,6]Output: Node 4 from this list 复制代码

解法一

第一种解法的思路比较容易想得到,先计算出链表的总长度,再计算出中间节点的下标,然后得遍历得到对应的节点即可。

代码

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public ListNode middleNode(ListNode head) {        if(head == null){            return null;        }        int len = 0;        for(ListNode curr = head; curr != null; ){            len++;            curr = curr.next;        }        int targetIndex = 0;        ListNode target = null;        for(ListNode curr = head; curr != null; ){            if(targetIndex == len / 2){                target = curr;                break;            }            targetIndex++;            curr = curr.next;        }        return target;    }}复制代码

解法二

第二种解法,使用快慢指针,让快指针的移动速度是慢指针的两倍,等到快指针到达终点时,慢指针恰好抵达中间节点。

一段小路上,A车行驶的速度是B车的两倍,等到A车到达终点时,B车恰好达到小路的中间位置。

代码

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {        public ListNode middleNode(ListNode head) {        if(head == null){            return null;        }                ListNode slow = head;        ListNode fast = head;                for(ListNode curr = slow; slow != null; ){                           if(fast == null || fast.next == null){                break;            }else{                fast = fast.next.next;            }            slow = slow.next;        }        return slow;            }}复制代码

到目前为止,我们已经使用快慢指针解决三个单链表相关的问题了:

解法三

解法三也比较巧妙, 遍历单链表,只有当下标为奇数时,指针才向前移动,到最后,指针所指即为中间节点。

代码

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {        public ListNode middleNode(ListNode head) {        if(head == null){            return null;        }        ListNode target = head;        int index = 0;        for(ListNode curr = head; curr != null; ){            if(index % 2 == 1){                target = target.next;            }            index++;            curr = curr.next;        }        return  target;        }}复制代码

以上三种解法的时间复杂度均为O(n),在leetcode上的运行时间为 1ms,超过 82.96%

相关练习

参考资料

  • 《》

转载地址:http://wjfva.baihongyu.com/

你可能感兴趣的文章
DRP——JDBC中的Batch
查看>>
[原][osg][gdal]两种方式修改tiff高程
查看>>
阿里云ACE下的PHP开发环境搭建
查看>>
ISE约束文件*.ucf的写法
查看>>
kibana显示elasticsearch集群中flume到入的日志
查看>>
R语言低级绘图函数-grid
查看>>
Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果
查看>>
Python 的基本运算和内置函数
查看>>
Oracle OCP之硬解析在共享池中获取内存锁的过程
查看>>
在imageView依次加入7个手势, 1.点击哪个button,往imageView上加入哪个手势.(保证视图上仅仅有一个手势). 2.轻拍:点击视图切换美女图片.(imageView上首先...
查看>>
2 怎样解析XML文件或字符串
查看>>
linux驱动编写之poll机制
查看>>
hdu 1874 畅通project续
查看>>
kvm克隆
查看>>
系统理论
查看>>
单点登录系统功能调试界面
查看>>
H5结合百度map实现GPS定位
查看>>
一起学习Maven
查看>>
Codeforces 474 D. Flowers
查看>>
Lightoj 1043 - Triangle Partitioning【二分】
查看>>