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); } }