algorithm-base/animation-simulation/链表篇/面试题 02.03. 链表中间节点.md

67 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

> 如果阅读时,发现错误,或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
> 感谢支持,该仓库会一直维护,希望对各位有一丢丢帮助。
>
> 另外希望手机阅读的同学可以来我的 <u>[**公众号:袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
#### [876. 链表的中间结点](https://leetcode-cn.com/problems/middle-of-the-linked-list/)
给定一个头结点为 head的非空单链表返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
**示例 1**
```java
输入:[1,2,3,4,5]
输出:3
```
> 说明:因为只有一个中间节点
**示例 2**
```java
输入:[1,2,3,4,5,6]
输出:4
```
> 说明:有两个中间节点所以返回后面那个
## 题目解析:
又精心筛选了一个题目,本来想写一下删除节点的题目,然后发现这个题目更符合目前的节奏,所以先写一下这个题目,明天再给大家写删除节点的题目。
大家先不要看我的题解先自己想一下怎么做。这个这个题目是想让我们找出中间节点昨天的题目是让我们倒数第K个节点想一下这两个题目有什么联系呢
先说一下刚开始刷题的小伙伴可能会想到的题解,两次遍历链表,第一次遍历获取链表长度,第二次遍历获取中间链表。
这个方法很OK利用数组先将所有链表元素存入数组里然后再直接获得中间节点。这个也很OK那么我们有没有一次遍历且不开辟辅助空间的方法呢
昨天的题目是一前一后双指针两个指针之间始终相差k-1位我们今天也利用一下双指针的做法吧。
这种类型的双指针是我们做链表的题目经常用到的,叫做快慢指针。
一个指针走的快,一个指针走的慢,这个题目我们可以让快指针一次走两步,慢指针一次走一步,当快指针到达链表尾部的时候,慢指针不就到达中间节点了吗?
链表中节点的个数有可能为奇数也有可能为偶数这是两种情况但是我们输出是相同的那就是输出slow指针指向的节点
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210321131249789.gif)
```java
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;
}
//返回slow指针指向的节点
return slow;
}
}
```