双向链表是java中很常见的一种数据结构,比如linkedHashMap、linkedList都是基于双向链表实现的,接下来我们手动实现一个简单的带头尾节点的双向链表:
package per.yangjm.datastructure.list; import javax.validation.constraints.NotNull; import java.util.function.Consumer; public class DoublelinkedList{ // 头节点 private Node head; // 尾节点 private Node tail; // 链表大小 private int size; // 初始化头尾节点 public DoublelinkedList() { this.head = new Node<>(null); this.tail = new Node<>(null); this.head.next = this.tail; this.tail.prev = this.head; } // 判断链表是否为空(不包含头尾节点) public boolean isEmpty() { return this.size == 0; } // 获取链表的元素个数(不包含头尾节点) public int size() { return this.size; } // 在链表末尾添加元素 public void add(T data) { Node node = new Node<>(data); Node prevNode = this.tail.prev; prevNode.next = node; node.next = this.tail; this.tail.prev = node; node.prev = prevNode; size++; } // 删除指定的非空元素 public void remove(@NotNull T data) { Node node = this.head; while (node != null) { if (data.equals(node.data)) { node.prev.next = node.next; node.next.prev = node.prev; size--; } node = node.next; } } // 遍历消费链表每个元素 public void traverse(Consumer consumer) { Node node = this.head; while (node != null) { if (node != this.head && node != this.tail) { consumer.accept(node.data); } node = node.next; } } static class Node { private T data; private Node prev; private Node next; public Node(T data) { this.data = data; } } public static void main(String[] args) { DoublelinkedList list = new DoublelinkedList<>(); System.out.println("链表为空:" + list.isEmpty()); list.add("a"); list.add("b"); list.add("c"); System.out.println("链表的大小为:" + list.size()); list.traverse(System.out::println); System.out.println("***********************************"); list.remove("b"); System.out.println("链表的大小为:" + list.size()); list.traverse(System.out::println); } }
IDE控制台执行结果如下,符合预期,这样我们就实现了一个简单的带头尾节点的双向链表,如果想实现更多复杂的处理逻辑,亦可进行扩展。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)