循环链表
循环链表一般包括循环单链表和循环双链表,如下图所示:

循环单链表
循环单链表与单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而使整个链表形成一个环。
一般对循环单链表只设尾指针不设头指针,其原因是,如果设的是头指针,对表尾进行操作需要O(n)的时间复杂度,而若设的是尾指针r,那么r->next即为头指针,对表头与表尾进行操作都只需要O(1)的时间复杂度。
单链表与循环单链表:
详细的单链表操作请参照单链表的定义及基本操作 ,在本文中只给出单链表与循环单链表的不同之处,根据描述稍加修改单链表的代码即可。
-
判空
循环单链表中,表尾结点*r的next域指向L,表中没有指针域为NULL的结点。因此,循环单链表的判空条件不是头结点的指针是否为空,而是它是否等于头指针。 -
插入、删除
循环单链表的插入、删除算法与单链表几乎一样,不同的是如果在表尾进行,那么要让单链表继续保持循环的性质,即让尾结点的next域指向头结点。 -
遍历
单链表只能从表头结点开始往后顺序遍历整个链表,循环单链表可以从表中的任意一个结点开始遍历整个链表。 -
查找
单链表的查找是从表头开始,找到表尾停止。而循环单链表中,若从表头开始查找,那与单链表的操作一致。若从表的任意位置开始查找,那么需要一个计数变量sum,当sum=表长时还未找到,则查找失败,退出循环。
循环双链表
循环双链表与双链表的区别在于,表中最后一个结点的next域指向头结点,头结点的prior域指向最后一个结点。
双链表与循环双链表:
详细的单链表操作请参照双链表的定义及基本操作 ,在本文中只给出双链表与循环双链表的不同之处,根据描述稍加修改双链表的代码即可。
-
判空
循环双链表中,当循环双链表为空时,其头结点的prior域和next域都等于L。 -
插入、删除
循环双链表的插入、删除算法与双链表几乎一样,不同的是如果在表尾进行,那么要让双链表继续保持循环的性质,即让尾结点的next域指向头结点,同时让头结点的prior域指向尾结点。 -
遍历
双链表只能从表头结点开始往后顺序遍历整个链表,循环双链表可以从表中的任意一个结点开始遍历整个链表。 -
查找
双链表的查找是从表头开始,找到表尾停止。而循环双链表中,若从表头开始查找,那与双链表的操作一致。若从表的任意位置开始查找,那么需要一个计数变量sum,当sum=表长时还未找到,则查找失败,退出循环。
静态链表
静态链表借助数组来描述线性表的链式存储结构,结点也有数据域data和指针域next,这里的指针是结点的相对地址(数组下标),又称游标。和顺序表一样,静态链表也需要预先分配一块连续的内存空间。
静态链表结构类型描述:
#define MaxSize 50 //静态链表的最大长度
typedef struct SLinkList{
ElemType data; //数据元素
int next; //下一个元素的数组下标
}SLinkList[MaxSize];
静态链表以next == -1作为其结束的标志。
静态链表的实例:

说明
先简单对循环链表和静态链表进行总结,具体的实现代码均未给出,若以后得空,则再补上。持续更新中。。。
1099

被折叠的 条评论
为什么被折叠?



