求單向鏈表的中間結點

求單向鏈表的中間結點

需求

非空的單向鏈表,返回其中間節點。若是有兩個中間結點,返回第二個。 鏈表大小控制在1~100之間。node

示例1:git

Input: [1,2,3,4,5]
Output: Node 3 from this list (Serialization: [3,4,5])
複製代碼

示例2:github

Input: [1,2,3,4,5,6]
Output: Node 4 from this list (Serialization: [4,5,6])
複製代碼

方法一:使用數組實現

循環遍歷鏈表,統計鏈表長度,同時將每一個結點存儲數組中,最後返回數組中角標爲(鏈表長度/2)的結點便可。數組

/**
     * 求單向鏈表的中間結點,使用數組實現
     * @param head
     * @return
     */
    public SingleNode middleNodeByArrays(SingleNode head) {
        SingleNode[] arrays = new SingleNode[100];
        int count = 0;
        while (head != null) {
            arrays[count] = head;
            count++;
            head = head.next;
        }
        return arrays[count / 2];
    }
複製代碼

測試代碼:bash

// 求單向鏈表的中間結點
        SingleLinkedList sll1 = new SingleLinkedList();
        for (int i = 1; i < 10; i++) {
            SingleNode node = new SingleNode(i, null);
            sll1.add(node);
        }
        System.out.println(sll1.toString());

        SingleNode node1 = middleNodeByArrays(sll1.getFirst());
        sll1.logFromHead("middleNodeByArrays1", node1);

        SingleLinkedList sll2 = new SingleLinkedList();
        for (int i = 1; i < 11; i++) {
            SingleNode node = new SingleNode(i, null);
            sll2.add(node);
        }
        System.out.println(sll2.toString());

        SingleNode node2 = middleNodeByArrays(sll2.getFirst());
        sll2.logFromHead("middleNodeByArrays2", node2);
複製代碼

輸出結果:符合預期。測試

SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9]
    middleNodeByArrays1:[5, 6, 7, 8, 9]
    SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    middleNodeByArrays2:[6, 7, 8, 9, 10]

複製代碼

方法二:使用快慢指針

定義兩個指針slow和fast,slow每次移動一步,fast每次移動兩步,這樣當fast尾結點的時候,slow必定位於鏈表的中間結點上。 代碼以下:ui

/**
     * 求單向鏈表的中間結點,使用快慢指針實現
     * @param head
     * @return
     */
    public SingleNode middleNodeByTwoPointers(SingleNode head) {
        SingleNode slow = head;
        SingleNode fast = head;

        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
複製代碼

測試代碼以下:this

// 求單向鏈表的中間結點
        SingleLinkedList sll1 = new SingleLinkedList();
        for (int i = 1; i < 10; i++) {
            SingleNode node = new SingleNode(i, null);
            sll1.add(node);
        }
        System.out.println(sll1.toString());

        SingleNode node1 = middleNodeByTwoPointers(sll1.getFirst());
        sll1.logFromHead("middleNodeByTwoPointers1", node1);

        SingleLinkedList sll2 = new SingleLinkedList();
        for (int i = 1; i < 11; i++) {
            SingleNode node = new SingleNode(i, null);
            sll2.add(node);
        }
        System.out.println(sll2.toString());
        SingleNode node2 = middleNodeByTwoPointers(sll2.getFirst());
        sll2.logFromHead("middleNodeByTwoPointers2", node2);
複製代碼

輸出結果以下:符合預期spa

SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9]
    middleNodeByTwoPointers1:[5, 6, 7, 8, 9]
    SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    middleNodeByTwoPointers2:[6, 7, 8, 9, 10]
複製代碼

完整代碼請查看

項目中搜索SingleLinkedList便可。.net

github傳送門 github.com/tinyvampire…

gitee傳送門 gitee.com/tinytongton…

參考: 一、middle-of-the-linked-list

二、使用Java實現單向鏈表,並完成鏈表反轉。

相關文章
相關標籤/搜索