本文主要是介绍力扣876——链表的中间节点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
提示:
给定链表的结点数介于 1 和 100 之间。
分析:
本题我们可以采用多种做法,这里介绍两种,一种是数组法,另一种是快慢指针法。
先看数组法,针对本题,题目说给定的节点数为1~100之间,我们就可以创建一个长度为100的数组,遍历链表,把所有节点依次放入数组中,然后返回中间的那个元素就可以了。
直接上代码:
class Solution {public ListNode middleNode(ListNode head) {ListNode arr[] = new ListNode[100];//创建一个长度为100的数组int t = 0;//定义数组下标从0开始while(head != null){//当链表节点不为null的时候arr[t++] = head;//把该节点放在数组中head = head.next;//更新head的位置}return arr[t / 2];//返回数组中间的元素,就是链表的中间节点}
}
接下来我们再来看快慢指针法;
定义一个快指针fast,每次走两步。定义一个慢指针slow,一次走一步。当fast为空,或者fast.next为空的时候,slow就位于中心节点。
也是直接上代码:
class Solution {public ListNode middleNode(ListNode head) {ListNode fast = head;//定义快指针从头节点开始ListNode slow = head;//定义慢指针从头节点开始while(fast != null && fast.next != null){//在循环条件内fast = fast.next.next;//快指针一次走两步slow = slow.next;//慢指针一次走一步}//循环结束时,要么是fast==null,要么是fast.next==null,不管是哪种情况,//slow都指到了要求的中间节点的位置return slow;//返回中间节点}}
这篇关于力扣876——链表的中间节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!