Java中实现单向循环链表的核心是让尾节点next指向头节点形成闭环,支持尾插、遍历(do-while防死循环)和判空,需确保插入删除时始终维护闭环结构。

Java 中实现循环链表,核心在于让尾节点的 next 指针指向头节点(而非 null),从而形成闭环。下面是一个简洁、可运行的单向循环链表实现,支持添加、遍历和判空操作。
定义节点类(Node)
每个节点包含数据域和指向下一个节点的引用,注意这里不设前驱指针,是单向循环链表:
static class Node {
int data;
Node next;
Node(int data) {
this.data = data;
this.next = null; // 初始为 null,后续手动连接成环
}
}
实现循环链表主体(CircularLinkedList)
维护一个 head 引用。空链表时 head == null;非空时,head 指向任意节点(通常视为“头”),且最后一个节点的 next 必须指向 head。
- 插入新节点(尾插法):若为空,新节点自己连自己(
node.next = node);否则找到尾节点(即tail.next == head的节点),将 tail 的 next 改为新节点,新节点 next 指向 head - 遍历时需防止死循环:从 head 出发,打印后移动到 next,直到再次回到 head 时停止
- 判空只需检查
head == null
static class CircularLinkedList {
private Node head;
public void add(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
head.next = head; // 自环
} else {
Node tail = head;
while (tail.next != head) {
tail = tail.next;
}
tail.next = newNode;
newNode.next = head;
}
}
public void display() {
if (head == null) {
System.out.println("List is empty");
return;
}
Node current = head;
do {
System.out.print(current.data + " -> ");
current = current.next;
} while (current != head);
System.out.println("(head)");
}
public boolean isEmpty() {
return head == null;
}
}
使用示例
在 main 方法中测试:
立即学习“Java免费学习笔记(深入)”;
public static void main(String[] args) {
CircularLinkedList list = new CircularLinkedList();
list.add(10);
list.add(20);
list.add(30);
list.display(); // 输出:10 -> 20 -> 30 -> (head)
}
关键注意事项
循环链表容易因指针误操作导致无限循环或逻辑错误,需特别注意:
- 插入/删除时务必维护闭环:任何修改都应确保至少有一个节点时,尾 → 头 的链接始终存在
- 遍历必须用
do-while或带退出条件的while,避免无终止循环 - 删除节点时要处理只剩一个节点的情况(删后需置
head = null) - 实际项目中建议封装完整增删查改,并增加 size 字段便于长度统计


















