1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
   | public class DoubleNode<T> {     private final T value;     private DoubleNode<T> previous;     private DoubleNode<T> next;
      public static void main(String[] args) {         DoubleNode<String> list = DoubleNode.build("hello", "world", "are", "you", "ok");         System.out.println("build: " + list);         DoubleNode<String> reversed = list.reverse();         System.out.println("reversed: " + reversed);         DoubleNode<String> origin = reversed.reverse();         System.out.println("origin: " + origin);         DoubleNode<String> tail = origin.getTailNode();         System.out.println("back: " + tail.toStringBack());     }
      public static <T> DoubleNode<T> build(T ...values) {         DoubleNode<T> list = null;         DoubleNode<T> cur = null;
          for (T value: values) {             if (cur == null) {                 cur = new DoubleNode<>(value);                 list = cur;             } else {                 DoubleNode<T> node = new DoubleNode<>(value);                 node.setPrevious(cur);                 cur.setNext(node);                 cur = cur.getNext();             }         }
          return list;     }
      public DoubleNode(T value) {         this.value = value;         this.previous = this.next = null;     }
      public DoubleNode<T> setNext(DoubleNode<T> next) {         this.next = next;         return this;     }
      public DoubleNode<T> getNext() {         return this.next;     }
      public T getValue() {         return this.value;     }
      public DoubleNode<T> getTailNode() {         DoubleNode<T> cur = this;         while (cur.getNext() != null) {             cur = cur.getNext();         }         return cur;     }
      public DoubleNode<T> getPrevious() {         return this.previous;     }
      public DoubleNode<T> setPrevious(DoubleNode<T> previous) {         this.previous = previous;         return this;     }
      public DoubleNode<T> reverse() {         DoubleNode<T> head = this;         DoubleNode<T> pre = null;
          while (head != null) {             DoubleNode<T> next = head.getNext();
                           head.setNext(pre);             head.setPrevious(next);             pre = head;
              head = next;         }
          return pre;     }
      @Override     public String toString() {         StringBuilder sb = new StringBuilder();         DoubleNode<T> cur = this;         while (cur != null) {             sb.append(cur.getValue());             sb.append(" -> ");             cur = cur.getNext();         }         sb.append("null");         return sb.toString();     }
      public String toStringBack() {         StringBuilder sb = new StringBuilder("null");         DoubleNode<T> cur = this;         while (cur != null) {             sb.append(" <- ");             sb.append(cur.getValue());             cur = cur.getPrevious();         }         return sb.toString();     } }
  |