出处:
https://leetcode-cn.com/problems/middle-of-the-linked-list/description/
题目描述:
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
解题思路:
快慢指针法:
(1)设置fast
,slow
两个指针都指向head
.
(2)如果head.next
为空,表明链表只有头节点,直接返回头节点。
(3)如果链表不止一个节点,则先让fast
指针走一步。然后进入循环,只要fast.next
和fast.next.next
都不为,就让
fast
走两步,让slow
走一步,最后返回slow.next
,既是我们要找的节点。
这是刚进入while
循环的链表结构.
这是最后找到中间节点的链表结构(注:返回的是slow.next
节点)
实现代码
/**
* @auther SNAYi
* @date 2019/4/25 下午 10:17
*/
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
if (head.next == null) {
return head;
}
fast = fast.next;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow.next;
}
}
注:此处是以偶数个节点的链表为例,但奇数个节点的链表找中间节点也同样适用.