Java 双向链表
Java 双向链表
Demo
package linkedlist; /** * 双向链表 * @param <T> */ public class DoubleLinkedList<T> { // 定义空的头结点 private DoubleNode<T> head = new DoubleNode<>(null, null, null); // 链表有效元素个数 int size = 0; /** * 校验元素下标是否在合法范围内 * * @param index * @return */ private boolean checkIndex(int index) { if (index >= 0 && index < size) { return true; } return false; } /** * 新增元素 * 插入到链表尾部 * * @param data */ public void add(T data) { DoubleNode<T> newNode = new DoubleNode<>(data, null, null); DoubleNode<T> temp = head; while (null != temp.next) { temp = temp.next; } temp.next = newNode; newNode.pre = temp; size++; } /** * 链表头插入新节点 * * @param data */ public void addFirst(T data) { DoubleNode<T> newNode = new DoubleNode<>(data, null, null); newNode.next = head.next; newNode.pre = head; head.next = newNode; size++; } /** * 用指定元素替换列表中指定位置的元素 * * @param index * @param data * @return */ public T set(int index, T data) { if (!checkIndex(index)) { throw new IndexOutOfBoundsException(); } DoubleNode<T> temp = head.next; for (int i = 0; i < index; i++) { temp = temp.next; } T oldData = temp.data; temp.data = data; return oldData; } /** * 从链表中移除第一次出现的指定元素 * * @param obj 待移除元素 * @return true:元素存在,移除成功;false:元素不存在,移除失败 */ public boolean remove(Object obj) { // temp指向的是待删除节点,注意,此处与单链表有区别 DoubleNode<T> temp = head.next; while (null != temp) { if (obj.equals(temp.data)) { // 被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收 temp.pre.next = temp.next; // 非最后一个节点,刷新前指针 if(null != temp.next){ temp.next.pre = temp.pre; } size--; return true; } temp = temp.next; } return false; } /** * 遍历,打印元素 */ public void linkedListPrint() { DoubleNode<T> temp = head.next; if (null == temp) { return; } while (null != temp) { System.out.println(temp.data); temp = temp.next; } } } /** * 双向链表节点定义 * * @param <T> */ class DoubleNode<T> { T data; DoubleNode<T> next; DoubleNode<T> pre; public DoubleNode(T data, DoubleNode<T> next, DoubleNode<T> pre) { this.data = data; this.next = next; this.pre = pre; } }