Python 官方文档:入门教程 => 点击学习
双向链表实现 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
注意:在操作双向链表时,不要去移动指向前驱节点和后继节点的指针,而是重新定义指向头尾的指针进行移动。*
环境
自定义操作接口
双向链表。
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;
@Override
public void add(E item) {
this.linkLast(item);
}
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++;
}
@Override
public E get(int index) {
//校验index是否合法
checkIndex(index);
//获取index元素
return getNode(index).item;
}
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));
}
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;
}
}
@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;
}
@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));
}
}
--结束END--
本文标题: java数据结构实现双向链表功能
本文链接: https://www.lsjlt.com/news/158534.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0