循环链表
循环链表是一类特殊的链表,之前文章所说的链表都是非循环的,无论是单链表结点(node)还是双链表结点(d_node),链表最后一个结点的next指针都指向NULL。而在循环链表中,链表最后一个结点的next指针指向的是表头结点。这样,整个链表的结构就呈现出一个环形。
循环链表的有点有二:其一是循环链表的表尾结点的next指针不需要指向NULL;其二是在循环链表中,从任何结点出发,总能找到另一个任意结点(因为循环链表是一个环形结构)。
循环单链表
//尾插法创建循环单链表
node *newCircleList_Tail() {
int x;
node *l = new node;
node *s, *r = l;
cin >> x;
while (x != 9999) {
s = new node;
s->data = x;
r->next = s;
r = s;
cin >> x;
}
r->next = l;
return l;
}
创建循环单链表原理非常简单,就是在原来创建非循环单链表的基础上,让最后一个结点的next指针指向表头即可,这样单链表就构成了一个首尾一致的环形,即循环单链表。
相较于非循环单链表,循环单链表的优点在于方便进行结点的插入删除操作(因为从任何结点处出发,都可以访问链表上的任何结点)。
循环双链表
//尾插法创建循环双链表
d_node *newDoubleCircleList_Tail() {
int x;
d_node *l = new d_node;
d_node *s, *r = l;
cin >> x;
while (x != 9999) {
s = new d_node;
s->data = x;
r->next = s;
s->prior = r;
r = s;
cin >> x;
}
r->next = l;
l->prior = r;
return l;
}
从拓扑角度来看,每个结点都可以看作一个点,而结点指向下一个结点就可以看作结点和结点之间用一条带方向的线连接。而循环链表的拓扑结构,就可以看作结点构成的一个圆,循环单链表的圆只能指向单一方向,而循环双链表就可以双向操作,即在任意节点既可以顺时针遍历全部结点,又可以逆时针遍历全部结点。
目前所学习的链表中,循环双链表是实现功能最便捷的链表。
总结
在实际问题时,关于循环链表可以有很多问题,比如如何判断循环链表对称性,或者如何判断某个链表有没有成环的情况出现。