循环链表:
循环链表的定义:
循环链表是指头尾相接的一种链表(即:最后一个指针域指向头结点,整个链表形成一个环状)
优点
从一个任意一个结点出发都能找到其他结点
特点
循环链表没有NULL指针,在遍历结束后的判断条件是p!=L(头指针是它的判定条件)
尾结点表示单循环链表
指针R指向尾结点(即最后一个结点)那么a1的存储位置表示:R->next->next,an的存储位置的表示:
an=R;时间复杂度都为O(1);
头结点表示单循环链表
找a1的时间复杂度为O(1)
找an的时间复杂度O(n)
基本操作的实现:
数据结点的结构体定义
typedef struct Lnode {
int data;
struct Lnode* next;
}Lnode, * LinkList;
双向链表的创建:
void createLinkList(LinkList& L, int n) {
L = (Lnode*)malloc(sizeof(Lnode));
L->next = L;
Lnode* p1 = L;
for (int i = n; i > 0; i--) {
Lnode* p = (Lnode*)malloc(sizeof(Lnode));
printf("input data:");
scanf("%d", &p->data);
p->next = L;
p1->next = p;
p1 = p;
}
}
双向链表的遍历
void ergodicList(LinkList& L) {
Lnode* R;
R = L->next;
while (R!=L) {
printf("data:%d", R->data);
R = R->next;
}
}
通过尾结点遍历链表
void ergodicList_T(LinkList& pTail) {
Lnode *R;
R = pTail->next->next;
while (R != pTail->next) {
printf("data:%d", R->data);
R = R->next;
}
}
合并两个循环链表
Lnode * LinkListMerge(LinkList& p1, LinkList& p2){
Lnode* t = p1->next;
p1->next = p2->next->next;
free(p2->next);
p2->next = t;
p1 = p2;
return p2;
}