链表-链表的中间节点
题目:给定一个头结点为 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 之间。
https://leetcode-cn.com/problems/middle-of-the-linked-list/
题目分析1:
对于本题,如果是一个普通数组,我们会想到先获取数组的长度,然后返回中间值。但是链表不能直接通过下标访问对应的元素,所以对链表进行遍历,将遍历到的元素依次放入到一个数组中。
import org.junit.Test;public class demo {public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }}public ListNode middleNode(ListNode head) {//声明一个数组(链表结点数介于1~100之间)ListNode[] list = new ListNode[100];int index = 0;//将所有结点存放到数组中while(head!=null) {list[index++] = head;head = head.next;}//返回中间结点return list[index/2];}@Testpublic void test876() {ListNode six = new ListNode(6);ListNode fifth = new ListNode(5,six);ListNode fourth = new ListNode(4,fifth);ListNode third = new ListNode(3,fourth);ListNode second = new ListNode(2,third);ListNode head = new ListNode(1,second);middleNode(head);}
}
题目分析2:
对于该题来说,可以使用快慢指针法,设置两个初始指向head的指针,两个指针一起遍历链表,慢指针一次走一步,快指针一次走两步,当快指针走到链表末尾时,慢指针刚好在链表中间。
import org.junit.Test;public class demo876 {public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }}public ListNode middleNode(ListNode head) {//初始化快慢指针均为headListNode slow = head;ListNode fast = head;//慢指针移动一步,快指针移动两步while(fast!=null && fast.next!=null) {slow = slow.next;fast = fast.next.next;}return slow; }@Testpublic void test876() {ListNode six = new ListNode(6);ListNode fifth = new ListNode(5,six);ListNode fourth = new ListNode(4,fifth);ListNode third = new ListNode(3,fourth);ListNode second = new ListNode(2,third);ListNode head = new ListNode(1,second);middleNode(head);}
}
自己在做题时没有想到使用快慢指针的算法,后来看到题解中快慢指针的算法,真秀呀!
链表-链表的中间节点相关推荐
- 删除单链表中的重复节点(c语言版本)
这是一道经典的面试题,下面是我的研究和举一反三,特整理如下: 分为三种情形: (1)删除有序链表的重复节点,重复节点一个都不留 (2)删除有序链表的重复节点,重复节点只留一个 (3)删除无序链表的重复 ...
- 编写代码,移除未排序的链表中的重复节点
2019独角兽企业重金招聘Python工程师标准>>> 解法一:如果不得使用临时缓冲区,该怎么解决? 要想移除链表中的重复节点,我们需要设法记录有哪些是重复的.这里只需要使用到一个简 ...
- python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...
一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...
- 每天一道LeetCode-----将链表每k个节点逆序一次
Swap Nodes in Pairs 原题链接 Swap Nodes in Pairs 意思是将链表每两个节点互换位置,要求不能直接改变链表的值,只能改变next指针的方式交换 其实就是遍历一遍每两 ...
- 面试题18: 删除链表节点:删除链表中重复的节点
/******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...
- 【IT笔试面试题整理】删除无序链表中重复的节点
[试题描述]定义一个函数,输入一个链表,删除无序链表中重复的节点 [参考代码] 方法一: Without a buffer, we can iterate with two pointers: &qu ...
- python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法
本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点. 代码: class LinkedListAlgori ...
- 牛客题霸 [链表中环的入口节点] C++题解/答案
牛客题霸 [链表中环的入口节点] C++题解/答案 题目描述 对于一个给定的链表,返回环的入口节点,如果没有环,返回null 拓展: 你能给出不利用额外空间的解法么? 题解: 判断环有个很巧妙的方法, ...
- 用O(1)的时间复杂度删除单链表中的某个节点
用O(1)的时间复杂度删除单链表中的某个节点 给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode {int m_nKey;ListNode* ...
- 删除一个无头单链表的非尾节点(C语言)
void DelNotTailNode(PSListNode pos) {PSListNode pNode = NULL;assert(pos);if (NULL == pos->pNextNo ...
最新文章
- 约会安排 (区间合并)毒瘤题
- 桥接模式、NAT模式、仅主机模式理解
- 面向全球用户的Teams app之夏令时篇
- 2021年春季学期期末统一考试 劳动与社会保障法(本) 试题
- 在ubuntu中为程序添加图标快捷键
- Oracle 制造死锁和查询死锁
- 利用Gitee搭建个人图床(上)
- jQuery学习笔记01:初试jQuery
- python智能机器人设计与实现_从AI模型到智能机器人:基于Python与TensorFlow
- 《Unix/linux编程实践教程》------重定向程序的I/O
- 推荐DS书籍阅读笔记
- 二等水准数据平差_自编单次二等水准平差计算表
- 【生活相关】一(坚持)
- Endnote_X9安装及使用教程
- 2017.3.5阿凡python简单爬虫尝试,奉献源码
- MMDetection框架入门教程(完全版)
- Uniapp微信小程序视频全屏播放功能极简实现法
- 一个花里胡哨的渐变雷达图 echarts图表
- EndNote X9插入参考文献的格式
- 链表的两种创建方法——头插法与尾插法