预备知识
单链表
1.0循环链表的定义
如果把单链表的尾部的next指针有指向空转为指向头结点,那么就构成了循环链表
由于找到链表的头部的时间复杂度是O(1)
找到链表尾部的时间复杂度是 O(n) 但是我们对链表的操作一般都是对尾巴和头进行处理的
所以最优解是 不设置头指针,改为设置尾指针rear这样,头节点就是 rear->next
尾节点就是rear 这是大多数循环链表的处理方法
2.0 循环链表的基本操作
循环链表没有增加任何存储量,只是链接方式改变了,所以其他操作与单链表相同,只是需要注意循环条件防止进入死循环就可以了。
举个栗子
//头插法建立循环链表
LinkList(int a[],int n){ //数组形参数作为给单链表赋值
first = new Node;
first->next = first; //立一个只有头结点的空链表
//头插法第一个元素是
Node *s = new Node;
s->data = a[0];
s->next = first->next;
first->next = s;
rear = s;
for(int i = 1;i < n;i++ ){
Node *s = new Node;
s->data = a[i]; //赋值
s->next = first->next; //每个新建的结点都要链接之前头结点所指向的结点
first->next = s; //头插法,每个元素结点都插在头结点后
}
}
各个算法的时间性能和单链表一样