| 1 package org.shiftone.cache.util; 2 3 4 5 14 public class LinkedList 15 { 16 17 private static Log LOG = new Log(LinkedList.class); 18 private LinkedListNode header = null; 19 private int size = 0; 20 21 25 public LinkedList() 26 { 27 28 header = new LinkedListNode(null); 29 header.value = header; header.prev = header; 31 header.next = header; 32 } 33 34 35 40 public final LinkedListNode addFirst(Object obj) 41 { 42 return addBefore(header.next, obj); 43 } 44 45 46 49 public final LinkedListNode addLast(Object obj) 50 { 51 return addBefore(header, obj); 52 } 53 54 55 58 public final Object dequeue() 59 { 60 return removeLast(); 61 } 62 63 64 68 public final Object pop() 69 { 70 return removeFirst(); 71 } 72 73 74 77 public final LinkedListNode peekFirst() 78 { 79 80 return (header.next == header) 81 ? null 82 : header.next; 83 } 84 85 86 89 public final LinkedListNode peekLast() 90 { 91 92 return (header.prev == header) 93 ? null 94 : header.prev; 95 } 96 97 98 101 private final Object removeFirst() 102 { 103 return remove(header.next); 104 } 105 106 107 110 private final Object removeLast() 111 { 112 return remove(header.prev); 113 } 114 115 116 119 public final void moveToFirst(LinkedListNode node) 120 { 121 remove(node); 122 addNodeBefore(header.next, node); 123 } 124 125 126 129 public final void moveToLast(LinkedListNode node) 130 { 131 remove(node); 132 addNodeBefore(header, node); 133 } 134 135 136 139 public final LinkedListNode addBefore(LinkedListNode node, Object obj) 140 { 141 142 LinkedListNode newNode = new LinkedListNode(obj); 143 144 addNodeBefore(node, newNode); 145 146 return newNode; 147 } 148 149 150 153 public final void addNodeBefore(LinkedListNode nodeToAddBefore, LinkedListNode newPreviousNode) 154 { 155 156 newPreviousNode.prev = nodeToAddBefore.prev; 157 newPreviousNode.next = nodeToAddBefore; 158 newPreviousNode.prev.next = newPreviousNode; 159 newPreviousNode.next.prev = newPreviousNode; 160 161 size++; 162 } 163 164 165 168 public final Object remove(LinkedListNode node) 169 { 170 171 if ((node == null) || (node == header)) 172 { 173 return null; 174 } 175 176 node.prev.next = node.next; 177 node.next.prev = node.prev; 178 node.prev = null; 179 node.next = null; 180 181 size--; 182 183 return node.value; 184 } 185 186 187 190 public int size() 191 { 192 return size; 193 } 194 195 196 199 public String toString() 200 { 201 202 StringBuffer sb = new StringBuffer (); 203 LinkedListNode thisNode = header.next; 204 205 sb.append("[LIST size=" + size() + "]"); 206 207 while (thisNode != header) 208 { 209 sb.append("<->"); 210 sb.append(String.valueOf(thisNode.value)); 211 212 thisNode = thisNode.next; 213 } 214 215 return sb.toString(); 216 } 217 218 219 222 public static void main(String [] args) 223 { 224 225 LinkedList fifo = new LinkedList(); 226 227 for (int i = 0; i < 5; i++) 228 { 229 fifo.addFirst("#" + i); 230 } 231 232 LinkedListNode a = fifo.addFirst("AAAAA"); 233 LinkedListNode b = fifo.addFirst("BBBBB"); 234 235 for (int i = 5; i < 10; i++) 236 { 237 fifo.addFirst("#" + i); 238 } 239 240 fifo.moveToFirst(a); 241 fifo.moveToLast(b); 242 243 249 } 250 } 251 | Popular Tags |