⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现
⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁
循环链表
- 1、简介
- 2、代码实现思路总览
- 3、Node
- 4、CircularLinkedList
- 4.1、添加节点
- 4.2、删除节点
- 4.3、显示链表内容
1、简介
循环链表是一种特殊的链表,与普通链表不同的是,在循环链表中,最后一个节点的后继指针指向第一个节点,形成一个环形结构。因此,循环链表可以无限循环下去,直到外部因素中断。
循环链表与普通链表的基本操作相同,下面是一些常见的操作:
- 链表的创建:与普通链表类似,在创建链表时需要创建头节点,并将其后继指针指向第一个节点。然后逐个创建后续节点,将前一个节点的后继指针指向当前节点,直到创建完整个链表。最后将最后一个节点的后继指针指向头节点,形成一个环形结构。
- 链表的遍历:与普通链表类似,从头节点开始,逐个遍历链表中的节点,直到回到头节点为止。
- 链表的插入:可以在链表的任意位置插入一个新节点。具体操作是先将新节点的后继指针指向插入位置的后继节点,然后将插入位置的后继指针指向新节点。
- 链表的删除:可以删除链表中的任意节点。具体操作是将待删除节点的前一个节点的后继指针指向待删除节点的下一个节点,然后释放待删除节点的内存空间。
循环链表的时间复杂度与普通链表相同,具体如下:
- 链表的创建时间复杂度为O(n),其中n为链表中节点的个数。
- 链表的遍历时间复杂度为O(n),其中n为链表中节点的个数。
- 链表的插入时间复杂度为O(1)。
- 链表的删除时间复杂度为O(1)。
需要注意的是,在操作循环链表时,需要特别处理头尾节点的关系。此外,循环链表可以无限循环下去,因此在使用循环链表时需要注意循环终止条件,以免进入无限循环。循环链表的应用场景与普通链表类似,通常用于需要无限循环遍历的场景。
2、代码实现思路总览
3、Node
package linkedList.circularLinkedList;
/**
* @author 逐梦苍穹
* @date 2023/4/27 13:55
*/
public class Node {
private int id;
private Node next;
public Node(int id) {
this.id = id;
}
@Override
public String toString() {
return "Node{" +
"id=" + id +
", next=" + (next == null ? null
: ("0x" + Integer.toHexString(next.hashCode()))) +
'}';
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
4、CircularLinkedList
package linkedList.circularLinkedList;
/**
* @author 逐梦苍穹
* @date 2023/5/22 14:48
*/
public class CircularLinkedList {
private Node firstNode = null;
public void add(Node node) {
if (firstNode == null) {
firstNode = node;
firstNode.setNext(firstNode);
} else {
Node temp = firstNode;
while (temp.getNext() != firstNode) {
temp = temp.getNext();
}
temp.setNext(node);
node.setNext(firstNode);
}
}
public void delete(int id) {
Node temp = this.firstNode;
if (temp == null) {
System.out.println("链表空无法删除");
return;
}
while (true) {
if (temp.getNext() == firstNode) break;
if (temp.getNext().getId() == id) {
temp.setNext(temp.getNext().getNext());
System.out.println("Node{id=" + id + "}:删除成功");
return;
}
temp = temp.getNext();
}
System.out.println("无此节点");
}
public void show(){
if (firstNode == null) {
System.out.println("环形链表为空无法显示");
return;
}
// 因为firstNode不能动,因此我们仍然使用一个辅助指针完成遍历
Node temp = firstNode;
while (true) {
System.out.println(temp);
if (temp.getNext() == firstNode) {// 说明已经遍历完毕
break;
}
temp = temp.getNext(); // temp后移
}
}
}
4.1、添加节点