Java如何实现双向链表功能
更新时间:2021年11月26日 09:50:12 作者:m0_38025927
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表
双向链表实现
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。注意:在操作双向链表时,不要去移动指向前驱节点和后继节点的指针,而是重新定义指向头尾的指针进行移动。*
环境
IDEA
自定义操作接口
双向链表
。
public interface MyList<E> { void add(E node); E get(int index); E remove(int index); int size(); }
实现类
public class MyDoublyLinkList<E> implements MyList<E> { /** * 定义双向链表节点 */ class Node<E> { Node<E> prev; E item; Node<E> next; public Node(Node<E> prev, E item, Node<E> next) { this.prev = prev; this.item = item; this.next = next; } } private Node<E> head; private Node<E> tail; private int size; /** * 将节点添加到尾部 * * @param item * @return */ @Override public void add(E item) { this.linkLast(item); } /** * 添加一个元素到尾部 * * @param e */ private void linkLast(E e) { //获取tail Node<E> node = this.tail; //创建一个node Node<E> newNode = new Node<>(node, e, null); this.tail = newNode; if (node == null) this.head = newNode; else node.next = newNode; size++; } /** * 获取指定位置元素 * @param index * @return */ @Override public E get(int index) { //校验index是否合法 checkIndex(index); //获取index元素 return getNode(index).item; } /** * 校验index合法性 * * @param index */ private void checkIndex(int index) { if (!(index >= 0 && index < this.size)) throw new IndexOutOfBoundsException(String.format("index out of bounds,index:%s,size:%s", index, this.size)); } /** * 获取node * * @param index * @return */ private Node<E> getNode(int index) { if (index > (size >> 1)) { Node<E> node = this.tail; //从tail向前遍历 for (int i = size - 1; i > index; i--) { node = node.prev; } return node; } else { //从head向后遍历 Node<E> node = this.head; for (int i = 0; i < index; i++) { node = node.next; } return node; } } /** * 删除指定位置元素 * * @param index * @return */ @Override public E remove(int index) { //判断index合法性 this.checkIndex(index); Node<E> node = getNode(index); E e = node.item; //判断是否为头节点 if (node.prev == null) { this.head = node.next; } else { node.prev.next = node.next; node.prev = null; } //判断是否为尾节点 if (node.next == null) { this.tail = node.next; } else { node.next.prev = node.prev; node.next = null; } node.item = null; size--; return e; } /** * 获取链表长度 * * @return */ @Override public int size() { return this.size; } }
测试方法
public static void main(String[] args) { MyList<String> stringMyList = new MyDoublyLinkList<>(); System.out.println(stringMyList.size()); stringMyList.add("a"); stringMyList.add("b"); stringMyList.add("c"); stringMyList.add("d"); System.out.println(stringMyList.size()); String re = stringMyList.remove(1); System.out.println(re); for (int i = 0; i < stringMyList.size(); i++) { System.out.println(stringMyList.get(i)); } }
到此这篇关于Java如何实现双向链表功能的文章就介绍到这了,更多相关Java 双向链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot+MyBatis简单数据访问应用的实例代码
这篇文章主要介绍了SpringBoot+MyBatis简单数据访问应用的实例代码,需要的朋友可以参考下2017-05-05Canal搭建 idea设置及采集数据到kafka的操作方法
这篇文章主要介绍了Canal搭建idea设置及采集数据到kafka的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-05-05springcloud gateway如何实现路由和负载均衡
这篇文章主要介绍了springcloud gateway如何实现路由和负载均衡的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
最新评论