摘自:http://www.cnblogs.com/skywang12345/p/3561803.html
一、双向链表
双向链表是链表的一种。它的每一个结点都有两个指针,一个指向前一个结点,一个指向后一个结点。因此可以从双向链表的任意结点开始可以很方便的访问链表的任意位置。
双向链表示意图
1、双向链表的删除
2、双向链表的插入
三、Code
在做删除插入的时候,最好把图画出来。这样思路就很清晰
1 package algorithm; 2 3 /** 4 * Created by adrian.wu on 2019/2/26. 5 */ 6 public class DLink<T> { 7 private DNode<T> head; 8 9 private int nodeCount; 10 11 private class DNode<T> { 12 DNode<T> preNode; 13 DNode<T> next; 14 T value; 15 16 DNode(T value, DNode<T> pre, DNode<T> next) { 17 this.value = value; 18 this.preNode = pre; 19 this.next = next; 20 } 21 } 22 23 public DLink() { 24 head = new DNode<>(null, null, null); 25 head.preNode = head.next = head; 26 } 27 28 29 public int size() { 30 return nodeCount; 31 } 32 33 public boolean isEmpty() { 34 return nodeCount == 0; 35 } 36 37 @SuppressWarnings("unchecked") 38 private DNode<T> getNode(int index) { 39 if (index < 0 || index >= nodeCount) throw new IndexOutOfBoundsException(); 40 41 DNode<T> node = head; 42 if (index == 0) return node; 43 44 if (index <= nodeCount / 2) 45 for (int i = 0; i <= index; i++) 46 node = node.next; 47 else 48 for (int i = nodeCount - index - 1; i > 0; i--) 49 node = node.preNode; 50 51 return node; 52 } 53 54 //插入到index结点的前面 55 public void insert(int index, T t) { 56 DNode<T> node = getNode(index); 57 DNode<T> insertNode = new DNode<>(t, node.preNode, node); 58 node.preNode.next = insertNode; 59 node.preNode = insertNode; 60 if (index == 0) head = insertNode; 61 nodeCount++; 62 } 63 64 //删除第index个结点 65 public void delete(int index) { 66 DNode<T> node = getNode(index); 67 node.preNode.next = node.next; 68 node.next.preNode = node.preNode; 69 if (index == 0) head = node.next; 70 nodeCount--; 71 } 72 }