数据结构 循环链表CircleLinkedList
单向循环链表
单向循环链表的尾节点的 next 指针不再是 null,而是指向链表的头节点,以形成环
实现单向循环链表
相比单向链表,单向循环链表需要重写插入节点、删除节点两个方法
插入节点
对于插入节点,需要特别关注插入头节点的情况,此时需要拿到尾节点,然后将其 next 指向新的头节点
1 |
|
删除节点
如果删除的是头节点,删除后需让last指向新的头节点。
当只有一个节点并删除时, first指向null。
1 |
|
双向循环链表
双向循环链表的头节点的 prev 不再是 null,而是指向尾节点
双向循环链表的尾节点的 next 不再是 null,而是指向头节点
实现双向循环链表
相比双向链表,双向循环链表需要重写插入节点、删除节点两个方法
插入节点
插入节点需要对添加第一个节点和添加尾节点进行特殊处理
1 |
|
删除节点
- 删除节点,就是在环上去掉某一个节点,然后根据删除的节点是头节点或者尾节点来处理first 和 last
- 链表只有一个节点时同样需要特殊处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26// 删除元素
public E remove(int index) {
checkRange(index);
// 获取要删除的节点
Node<E> node = getNode(index);
// 如果链表只有一个节点,其前驱和后继都是自己本身,重新设置不会断掉引用
if(size==1) {
first = null;
last = null;
// 链表不只一个节点
}else {
Node<E> prev = node.prev;
Node<E> next = node.next;
prev.next = next;
next.prev = prev;
// 如果删除的是头尾节点,还需要维护first或者last
if(node == first) {
first = next;
}
if(node == last) {
last = prev;
}
}
size --;
return node.element;
}
参考
本博客所有文章除特别声明外,均采用 知识共享署名-相同方式共享 4.0 国际许可协议 ,转载请注明出处!