java实现带头双向循环链表(附完整源码)
时间: 2023-11-09 21:07:44 浏览: 191
以下是Java实现带头双向循环链表的完整源码,供参考:
```
public class DoublyCircularLinkedList<T> {
private Node<T> head; // 头节点
// 节点类
private static class Node<T> {
T data;
Node<T> prev;
Node<T> next;
Node(T data) {
this.data = data;
this.prev = null;
this.next = null;
}
}
// 构造函数
public DoublyCircularLinkedList() {
head = new Node<>(null);
head.prev = head;
head.next = head;
}
// 在链表末尾添加元素
public void add(T data) {
Node<T> node = new Node<>(data);
node.prev = head.prev;
node.next = head;
head.prev.next = node;
head.prev = node;
}
// 在指定位置插入元素
public void insert(int index, T data) {
Node<T> node = new Node<>(data);
Node<T> p = head.next;
int i = 0;
while (p != head && i < index) {
p = p.next;
i++;
}
if (p == head || i > index) {
throw new IndexOutOfBoundsException();
}
node.prev = p.prev;
node.next = p;
p.prev.next = node;
p.prev = node;
}
// 删除指定位置的元素
public void remove(int index) {
Node<T> p = head.next;
int i = 0;
while (p != head && i < index) {
p = p.next;
i++;
}
if (p == head || i > index) {
throw new IndexOutOfBoundsException();
}
p.prev.next = p.next;
p.next.prev = p.prev;
p.prev = null;
p.next = null;
}
// 获取指定位置的元素
public T get(int index) {
Node<T> p = head.next;
int i = 0;
while (p != head && i < index) {
p = p.next;
i++;
}
if (p == head || i > index) {
throw new IndexOutOfBoundsException();
}
return p.data;
}
// 获取链表长度
public int size() {
Node<T> p = head.next;
int size = 0;
while (p != head) {
size++;
p = p.next;
}
return size;
}
}
```
该代码实现了带头双向循环链表的数据结构,支持在链表末尾添加元素、在指定位置插入元素、删除指定位置的元素、获取指定位置的元素、获取链表长度等操作。在算法实现中,通过一个Node类来表示链表中的节点,包含数据域、前驱指针和后继指针。同时,链表的头节点也是一个Node对象,通过头节点来连接链表的首尾,形成双向循环链表。
阅读全文