1. 单向循环链表简单介绍
单向循环链表(Singly Circular Linked List)是另一种形式的链式存贮结构。与单向链表不同,单向循环链表中没有next指针为null的结点,它的特点是表中最后一个结点的指针域指向表头结点,整个链表形成一个环。
2 单向循环链表的基本操作
2.1 创建结点类
public class SCLLNode {
private int data;//数据域
private SCLLNode next;//指针域
public SCLLNode(int data) {
this.data = data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public SCLLNode getNext() {
return next;
}
public void setNext(SCLLNode next) {
this.next = next;
}
public void display() {
System.out.print( data + " ");
}
}
2.2 创建链表类
public class SinglyCircularLinkedList {
private SCLLNode head;//表头
private int length = 0;
public SinglyCircularLinkedList() {
this.head = null;
}
//在链表头部添加结点
public void addHead(int data) {
SCLLNode newNode = new SCLLNode(data);
newNode.setNext(newNode);
if(head == null){
head = newNode;
} else{
SCLLNode curNode = head;
while(curNode.getNext() != head) {
curNode = curNode.getNext();
}
newNode.setNext(head);
curNode.setNext(newNode);
head = newNode;
}
length++;
}
//在链表头部删除结点
public void deleteHead() {
if(head == null){
System.out.println("空表,删除的结点不存在");
}
SCLLNode curNode = head;
SCLLNode temp =head;
while(curNode.getNext() != head) {
curNode = curNode.getNext();
}
curNode.setNext(head.getNext());
head =head.getNext();
temp = null;
length--;
}
//在链表尾部添加结点
public void addTail(int data) {
SCLLNode newNode = new SCLLNode(data);
newNode.setNext(newNode);
if (head == null) {
head = newNode;
} else {
SCLLNode curNode = head;
while(curNode.getNext() != head) {
curNode = curNode.getNext();
}
newNode.setNext(head);
curNode.setNext(newNode);
}
length++;
}
//在链表尾部删除结点
public void deleteTail() {
if(head == null){
System.out.println("空表,删除的结点不存在");
}
SCLLNode curNode = head;
SCLLNode preNode =head;
while(curNode.getNext() != head) {
preNode = curNode;
curNode = curNode.getNext();
}
preNode.setNext(head);
curNode = null;
length--;
}
//在指定位置插入结点
public void insertList(int data, int index) {
SCLLNode newNode = new SCLLNode(data);
newNode.setNext(newNode);
if(head == null){
head = newNode;
}
if(index > length+1 || index < 1) {
System.out.println("结点插入的位置不存在,可插入的位置为1到"+(length+1));
}
if(index == 1) {
SCLLNode curNode = head;
while(curNode.getNext() != head) {
curNode = curNode.getNext();
}
newNode.setNext(head);
curNode.setNext(newNode);
head = newNode;
} else{
SCLLNode preNode = head;
int count = 1;
while(count < index-1) {
preNode = preNode.getNext();
count++;
}
SCLLNode curNode = preNode.getNext();
newNode.setNext(curNode);
preNode.setNext(newNode);
}
length++;
}
//在指定位置删除结点
public void deleteList(int index) {
if(index > length || index < 1) {
System.out.println("结点删除的位置不存在,可删除的位置为1到"+length);
}
if(index == 1) {
SCLLNode curNode = head;
SCLLNode temp =head;
while(curNode.getNext() != head) {
curNode = curNode.getNext();
}
curNode.setNext(head.getNext());
head =head.getNext();
temp = null;
length--;
} else{
SCLLNode preNode = head;
int count = 1;
while(count < index-1) {
preNode = preNode.getNext();
count++;
}
SCLLNode curNode = preNode.getNext();
preNode.setNext(curNode.getNext());
length--;
}
}
//查找数据是否存在
public boolean containData(int data) {
if(head == null){
System.out.println("空表");
return false;
}
SCLLNode curNode = head;
while(curNode.getData()!= data){
if(curNode.getNext() == head) {
System.out.println("结点数据不存在");
return false;
}
curNode =curNode.getNext();
}
System.out.println("结点数据存在");
return true;
}
//获取指定位置的数据
public void getIndexData(int index) {
if(head == null){
System.out.println("空表");
}
if(index > length || index < 1) {
System.out.println("结点位置不存在,可获取的位置为1到"+length);
}else {
SCLLNode curNode = head;
int count =1;
while(count != index) {
curNode =curNode.getNext();
count++;
}
curNode.display();
System.out.println();
}
}
//修改指定位置的结点数据
public void updateIndexData(int index, int data) {
if(head == null){
System.out.println("空表");
}
if(index > length || index < 1) {
System.out.println("结点位置不存在,可更新的位置为1到"+length);
}else {
SCLLNode curNode = head;
int count =1;//while也可以用for循环方式解决
while(count != index) {
curNode =curNode.getNext();
count++;
}
curNode.setData(data);
}
}
//遍历链表
public void printAllNode() {
SCLLNode cur = head;
while (cur != null) {
cur.display();
cur = cur.getNext();
if(cur == head) {
break;
}
}
System.out.println();
}
//获取链表的长度
public int listLength() {
return length;
}
}
3 建立测试类
测试类建立如下,运行结果这里不再赘述。
public class SinglyCircularLinkedListTest {
public static void main(String[] args) {
SinglyCircularLinkedList list = new SinglyCircularLinkedList();
list.addHead(3);
list.addHead(2);
list.addHead(1);
list.addTail(4);
list.addTail(5);
list.addTail(6);
//list.deleteHead();
//list.deleteTail();
//list.insertList(0,0);
//list.deleteList(3);
//list.containData(0);
list.getIndexData(7);
//list.updateIndexData(7,0);
list.printAllNode();
}
}
4 参考资料
[1] 数据结构与算法经典问题解析