获取中间结点

/**
 * 求中间结点
 * <p>
 * 思路:采用两个指针,其中一个指针每次前进一个结点,另一个每次前进两个结点,当较快的指针到达链表尾结点时,
 * 慢指针指向的节点即为中间结点
 * <p>
 * 如果有两个中间结点,默认返回后面一个
 * <p>
 * 如果需要返回前面的节点,则需要一个变量 pre 记录慢指针的前一结点,并在偶数情况时返回 pre
 */
public class MiddleNode {

    public static void main(String[] args) {
        Node n1 = new Node(1);
        Node n2 = new Node(2);
        Node n3 = new Node(3);
        Node n4 = new Node(4);
        Node n5 = new Node(5);
        Node n6 = new Node(6);
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        n4.next = n5;
        n5.next = n6;

    }

    /**
     * 结点树为偶数时返回中间结点的后一个
     */
    public static Node resolution1(Node list) {
        if (list == null || list.next == null) {
            return list;
        }

        Node slow = list;
        Node fast = list;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }


    /**
     * 结点数为偶数时返回中间结点的前一个
     */
    public static Node resolution2(Node list) {
        if (list == null || list.next == null) {
            return list;
        }
        Node slowNode = list;
        Node fastNode = list;
        //如果对于偶数情况需要返回前面的中间结点,使用 pre 记录慢指针的前结点
        Node pre = null;
        while (fastNode != null && fastNode.next != null) {
            fastNode = fastNode.next.next;
            pre = slowNode;
            slowNode = slowNode.next;
        }
        //奇数情况 fast.next==null
        //偶数情况 fast==null
        //如果对于偶数情况需要返回前面的中间结点,则返回 pre
        if (fastNode == null) {
            return pre;
        }
        return slowNode;
    }
}

最后更新于

这有帮助吗?