public class MyBiLinkedList {
    Node head;
    Node tail;
    public Node getLast() {
        // temp变量来保存链表的最后那个节点
        Node temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        // 循环结束时,temp就是最后那个节点
        return temp;
    }
    // 添加新节点到链表尾部
    public void append(int obj) {
        Node node = new Node(obj);
        if (head == null) {
            head = node;
        } else {
            Node last = getLast();
            // 添加新节点
            last.next = node;
            node.prev = last;
            tail = node;
        }
    }
    public void display() {
        Node temp = head;
        StringBuilder sb = new StringBuilder();
        while (temp != null) {
            sb.append(temp.value + " -> ");
            temp = temp.next;
        }
        String res = sb.substring(0, sb.lastIndexOf(" -> "));
        System.out.println(res);
    }
    public void display2() {
        Node temp = tail;
        StringBuilder sb = new StringBuilder();
        while (temp != null) {
            sb.append(temp.value + " -> ");
            temp = temp.prev;
        }
        String res = sb.substring(0, sb.lastIndexOf(" -> "));
        System.out.println(res);
    }
    public static class Node {
        Node prev;
        Node next;
        int value;
        public Node(int value) {
            super();
            this.value = value;
        }
        public Node() {
        }
    }
    // 反转双向链表
    public void reverse() {
        Node pre = null;
        Node next = null;
        while (head != null) {
            next = head.next;
            head.next = pre;// ->改为<-
            head.prev = next;// <-改为->
            pre = head;// pre右移
            head = next;// head右移
        }
        head = pre;
    }
    public static void main(String[] args) {
        MyBiLinkedList linkedList = new MyBiLinkedList();
        linkedList.append(5);
        linkedList.append(4);
        linkedList.append(3);
        linkedList.append(2);
        linkedList.append(1);
        linkedList.display();
        linkedList.reverse();
        linkedList.display();
    }
}