Java 迭代 递归 反转 单链表 双向链表

246 阅读1分钟

Java 迭代 递归 反转 单链表 双向链表

private static int[] ints = new int[]{1, 2, 3, 4, 5};

    /**
     * 根据数组构造单链表
     */
    private static Node getNode() {
        Node node = new Node(-1);
        Node cursor = node;
        for (int i = 0; i < ints.length; i++) {
            cursor.value = ints[i];
            if (i < ints.length - 1) {
                cursor.next = new Node(-1);
            } else {
                cursor.next = null;
            }
            cursor = cursor.next;
        }
        return node;
    }

    /**
     * 迭代 - 反转链表
     */
    private static Node reverseNodeW(Node node) {
        Node temp;
        Node result = null;
        while (node != null) {
            temp = node.next;
            node.next = result;
            result = node;
            node = temp;
        }
        return result;
    }

    /**
     * 递归 - 反转 链表
     */
    private static Node reverseNodeR(Node node) {
        if (node == null || node.next == null) {
            return node;
        }
        Node result = reverseNodeR(node.next);
        node.next.next = node;
        node.next = null;
        return result;
    }

    /**
     * 根据数组构造双向链表
     */
    private static DoubleNode getDoubleNode() {
        DoubleNode node = new DoubleNode(ints[0]);
        DoubleNode temp = node;
        DoubleNode last = null;
        for (int i = 0; i < ints.length; i++) {
            temp.value = ints[i];
            temp.last = last;
            if (i < ints.length - 1) {
                temp.next = new DoubleNode(ints[i + 1]);
            } else {
                temp.next = null;
            }
            last = temp;
            temp = temp.next;
        }
        return node;
    }

    /**
     * 迭代 - 反转 双向链表
     */
    private static DoubleNode reverseDoubleW(DoubleNode node) {
        DoubleNode last = null;
        DoubleNode next;
        while (node != null) {
            next = node.next;
            node.last = next;
            node.next = last;
            last = node;
            node = next;
        }
        return last;
    }

    /**
     * 递归 - 反转 双向链表
     */
    private static DoubleNode reverseDoubleR(DoubleNode node) {
        if (node == null) {
            return node;
        }
        if (node.next == null) {
            //这里node结点是原始双向链表最后一个结点,所以反转时,这个结点是新链表头结点,则last为null
            node.last = null;
            return node;
        }
        DoubleNode result = reverseDoubleR(node.next);
        node.next.next = node;
        node.last = node.next;
        if (nodeOriginalRoot.value == node.value) {
            node.next = null;
        }
        return result;
    }

    /**
     * 双向链表记录原始头结点
     */
    private static DoubleNode nodeOriginalRoot = null;

    public static void main(String[] args) {
//        Node original = getNode();
//        Node res = reverseNodeR(original);
//        System.out.println("---zzz-----root.val = " + res.value);
        DoubleNode original = getDoubleNode();
        nodeOriginalRoot = original;
        DoubleNode res = reverseDoubleR(original);
        System.out.println("---zzz-----root.val = " + res.value);
    }