Java反转链表(单向链表和双向链表)

这是一个常见的考验 Coding 能力的笔试题。
主要思路就是:
对于每个节点,使用临时变量记录原来的前驱和原来的后继,然后把原来的前驱接到这个节点的后继上。
代码如下:

public class ReverseList {

    public static class Node {
        public int value;
        public Node next;

        public Node(int data) {
            this.value = data;
        }
    }

    //单向链表反转
    public static Node reverseList(Node head) {
        //记录原前驱
        Node pre = null;
        //记录原后继的辅助变量
        Node next;
        while (head != null){
            //记录原后继
            next = head.next;
            //反转
            head.next = pre;
            //刷新前驱
            pre = head;
            //刷新当前节点
            head = next;
        }
        //运行到最后pre是新的头
        return pre;
    }

    public static class DoubleNode {
        public int value;
        //前驱
        public DoubleNode pre;
        //后继
        public DoubleNode next;

        public DoubleNode(int data) {
            this.value = data;
        }
    }

    //双向链表反转
    public static DoubleNode reverseList(DoubleNode head) {
        //记录原前驱
        DoubleNode pre = null;
        //记录原后继的变量
        DoubleNode next;
        while (head != null){
            //记录原后继
            next = head.next;
            //反转
            head.next = pre;
            head.pre = next;
            //刷新前驱
            pre = head;
            //刷新当前节点
            head = next;
        }
        //运行到最后pre是新的头
        return pre;
    }

    public static void printLinkedList(Node head) {
        System.out.print("Linked List: ");
        while (head != null) {
            System.out.print(head.value + " ");
            head = head.next;
        }
        System.out.println();
    }

    public static void printDoubleLinkedList(DoubleNode head) {
        System.out.print("Double Linked List: ");
        DoubleNode end = null;
        while (head != null) {
            System.out.print(head.value + " ");
            end = head;
            head = head.next;
        }
        System.out.print("| ");
        while (end != null) {
            System.out.print(end.value + " ");
            end = end.pre;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head1 = new Node(1);
        head1.next = new Node(2);
        head1.next.next = new Node(3);
        printLinkedList(head1);
        head1 = reverseList(head1);
        printLinkedList(head1);

        DoubleNode head2 = new DoubleNode(1);
        head2.next = new DoubleNode(2);
        head2.next.pre = head2;
        head2.next.next = new DoubleNode(3);
        head2.next.next.pre = head2.next;
        head2.next.next.next = new DoubleNode(4);
        head2.next.next.next.pre = head2.next.next;
        printDoubleLinkedList(head2);
        printDoubleLinkedList(reverseList(head2));

    }

}

运行结果:
Java反转链表(单向链表和双向链表)_第1张图片

你可能感兴趣的:(Java基础)