今天分享的题目有:
-
LeetCode #876 链表的中间节点
-
LeetCode #206 反转链表
-
LeetCode #143 重排链表
01 LeetCode #876 链表的中间节点
题目描述:
给定一个头节点为 head 的非空单链表,返回链表的中间节点。
如果有两个中间节点,则返回第二个中间节点。
示例:
输入:[1,2,3,4,5]
输出:此列表中的节点 3
思路分析:
要找到链表的中间节点,可以定义两个指针,一个是慢指针slow,另一个是快指针fast。初始,慢指针slow和快指针fast都指向链表的头节点。然后,快指针fast每次向前移动两步,慢指针slow每次向前移动一步,当快指针fast不能继续向前移动时,慢指针slow所指的节点就是中间节点。
对于节点个数为奇数的链表来说,其中间节点只有一个;而对于节点个数为偶数的链表来说,其中间节点有两个。
接着,我们就通过动画来看下如何通过快慢指针找到链表的中间节点。
1.当快指针fast向前移动的条件是:fast.next!=null && fast.next.next != null时:
对于节点个数为奇数的链表来说,动画演示如下,此时链表的中间节点是节点3。
对于节点个数为偶数的链表来说,动画演示如下,此时链表的中间节点是节点2,即在2和3这两个中间节点中,找到是第一个中间节点。
2.当快指针fast向前移动的条件是:fast!=null && fast.next != null时:
对于节点个数为奇数的链表来说,动画演示如下,此时链表的中间节点是节点3。
对于节点个数为偶数的链表来说,动画演示如下,此时链表的中间节点是节点3,即在2和3这两个中间节点中,找到是第二个中间节点。
题目要求的是如果有两个中间节点,则返回第二个中间节点。因此,对于该题目而言,快指针fast向前移动的条件是:fast!=null && fast.next != null。
代码实现:
public ListNode middleNode(ListNode head){
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;