📅  最后修改于: 2023-12-03 14:54:16.084000             🧑  作者: Mango
循环链表是一种特殊的链表,与普通链表不同的是,其尾结点指向头结点,形成了一个环形结构。循环链表可以减少许多操作在处理首尾结点时的特殊情况,同时也方便地处理循环或周期性的数据结构。
在实现循环链表时,我们需要重写以下几个方法:
add
/**
* 在链表尾部添加一个节点,并让其指向头节点
* @param val 节点的值
*/
public void add(int val) {
if (head == null) {
head = new Node(val);
head.next = head;
return;
}
Node tail = head;
while (tail.next != head) {
tail = tail.next;
}
tail.next = new Node(val);
tail.next.next = head;
}
get
/**
* 获取第 index 个节点的值
* @param index 索引
* @return 对应节点的值
*/
public int get(int index) {
if (head == null) {
throw new IndexOutOfBoundsException();
}
Node p = head;
for (int i = 0; i < index; i++) {
p = p.next;
if (p == head) {
throw new IndexOutOfBoundsException();
}
}
return p.val;
}
delete
/**
* 删除第 index 个节点
* @param index 索引
* @return 是否删除成功
*/
public boolean delete(int index) {
if (head == null) {
return false;
}
if (index == 0) {
if (head.next == head) {
head = null;
} else {
head.val = head.next.val;
head.next = head.next.next;
}
return true;
}
Node p = head;
for (int i = 0; i < index - 1; i++) {
p = p.next;
if (p.next == head) {
return false;
}
}
p.next = p.next.next;
return true;
}
循环链表的应用包括但不限于以下领域:
循环链表是一种非常实用的数据结构。在实现上,需要特别注意并处理好头结点和尾结点的关系;在应用上,可以涉及到很多场景,包括存储循环数据、实现队列和约瑟夫环,以及图论等领域。