单向循环链表
单向循环链表和单向非环形链表的区就是,单向非环形链表的尾结点的指针是指向null的,而环形的是指向头结点。单向循环链表如图下所示:
节点类代码
class MyNode {
int data;
MyNode next;
String name;
public MyNode() {
}
public MyNode(int data) {
this.data = data;
}
public MyNode(int data, String name) {
this.data = data;
this.name = name;
}
@Override
public String toString() {
return "MyNode{" +
"data=" + data +
", name='" + name + '\'' +
'}';
}
}
单向循环链表代码
public class MyCircleSingleLinkedList {
// 添加 head 节点,指向头部,添加 tail 节点,指向尾部, 即 head 前一个节点
MyNode head = null;
MyNode tail = null;
// 添加(修改)到单向循环链表
public void add(MyNode myNode) {
// 判断该节点是否存在
MyNode temp = head;
while (temp != null) {
// 如果该节点已经存在,则修改
if (temp.data == myNode.data) {
temp.name = myNode.name;
return;
}
// 如果遍历结束则退出
if (temp == tail) {
break;
}
temp = temp.next;
}
// 如果单向循环链表为空时
if (head == null) {
head = myNode;
tail = myNode;
head.next = myNode;
} else {
tail.next = myNode;
myNode.next = head;
tail = myNode;
}
}
// 删除节点
public void remove(int id) {
if (head == null) {
System.out.println("当前链表为空");
return;
}
// 如果要删除头结点
if (head.data == id) {
// 如果只有头结点
if (head == tail) {
head = null;
tail = null;
return;
}
tail.next = head.next;
head = tail.next;
return;
}
// 删除的不是头结点
MyNode temp = head;
while (temp.next != null) {
// 遍历结束都没有删除的节点
if (temp.next == head) {
System.out.println("该节点不存在");
break;
}
// 如果要删除 temp 的下一个节点
if (temp.next.data == id) {
// 如果删除尾节点,则tail指向tail前一个节点
if (temp.next == tail)
tail = temp;
temp.next = temp.next.next;
break;
}
temp = temp.next;
}
}
// 打印链表
public void print() {
// 单向循环链表为空时
if (head == null) {
System.out.println("当前单向循环链表为空");
return;
}
// 打印
MyNode temp = head;
while (temp != null) {
System.out.println(temp);
// 如果遍历结束则退出
if (temp == tail) {
break;
}
temp = temp.next;
}
}
}
测试一下
public static void main(String[] args) {
MyCircleSingleLinkedList myCircleSingleLinkedList = new MyCircleSingleLinkedList();
System.out.println("--------------------添加------------------------");
myCircleSingleLinkedList.add(new MyNode(1, "Tom"));
myCircleSingleLinkedList.add(new MyNode(2, "Jone"));
myCircleSingleLinkedList.add(new MyNode(3, "Line"));
myCircleSingleLinkedList.print();
System.out.println("--------------------修改------------------------");
myCircleSingleLinkedList.add(new MyNode(1, "Yke"));
myCircleSingleLinkedList.add(new MyNode(2, "Mre"));
myCircleSingleLinkedList.print();
System.out.println("--------------------删除------------------------");
myCircleSingleLinkedList.remove(3);
myCircleSingleLinkedList.print();
}
运行结果
--------------------添加------------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='Jone'}
MyNode{data=3, name='Line'}
--------------------修改------------------------
MyNode{data=1, name='Yke'}
MyNode{data=2, name='Mre'}
MyNode{data=3, name='Line'}
--------------------删除------------------------
MyNode{data=1, name='Yke'}
MyNode{data=2, name='Mre'}