LeetCode 876java
给定一个带有头结点 head
的非空单链表,返回链表的中间结点。
若是有两个中间结点,则返回第二个中间结点。指针
链表的操做基本上都是能够套用快慢指针的思路
这道题也是,找中间节点就让慢指针一次走一格,快指针一次走两格,快指针走到头也就意味寻址结束,这时判断一下链表的基数偶数就行code
快慢指针的应用对象
package leetcode.linked; import leetcode.ListNode; /** * 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 * <p> * 若是有两个中间结点,则返回第二个中间结点。 * <p> * <p> * 示例 1: * <p> * 输入:[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: * <p> * 输入:[1,2,3,4,5,6] * 输出:此列表中的结点 4 (序列化形式:[4,5,6]) * 因为该列表有两个中间结点,值分别为 3 和 4,咱们返回第二个结点。 */ public class N876 { public ListNode middleNode(ListNode head) { ListNode fast = head; ListNode slow = head; while (null != fast.next && null != fast.next.next) { slow = slow.next; fast = fast.next.next; } if (null == fast.next) { return slow; } if (null != fast.next) { return slow.next; } return null; } public static void main(String[] args) { N876 n876 = new N876(); int[] as = new int[]{1}; ListNode listNode = ListNode.makeNode(as); ListNode result = n876.middleNode(listNode); ListNode.print(result); } }