循环链表
在单链表中遍历链表时,判断链表终端结点的next指针为空(node->next=NULL),则表示当前链表遍历完成。
循环链表中,将单链表中的终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,使得链表的头尾相接,这种链表称之为单循环链表,简称为循环链表++。
循环链表和单链表的主要差异就在于循环的判断条件上,单链表判断循环结束为:node->next==NULL;而循环链表判断循环结束为:(node->next)等于头结点。
循环链表的创建方式:
1.首先回忆一下之前链表的创建方式
尾插法创建链表
Node *CreateLinkListByTail(int n){
Node *p;
//初始化链表的头结点
LinkList=new Node;
//指针域为空
linkList->next=NULL;
head=LinkList;
for(auto i=0;i<n;i++){
p=new Node;
p->data=i;
LinkList->next=p;
LinkList=p;
}
LinkList->next=NULL;
return head;
}
2.尾插法创建循环链表算法
Node *CreateLoopLinkList(int n){
Node *p;
Node *tail;//指向尾结点的指针
LinkList=new Node;
LinkList->next=NULL;
head=LinkList;
for(auto i=0;i<n;i++){
p=new Node;
p->data=i;
LinkList->next=p;
LinkList=p;
}
//将尾结点赋值给尾指针
tail=LinkList;
//将尾指针的指针域指向头结点指向的指针域
tail->next=head->next;
return head;
}
遍历链表
//遍历链表
void ForeachLinkList(Node *tail, bool isLoopLinkList = false)
{
if (isLoopLinkList)
{
Node *p = tail->next;
while (p->next != head->next)
{
cout << p->data << endl;
p = p->next;
}
return;
}
// 循环链表的遍历方式,循环输出链表的元素,用于检测循环链表是否创建成功
while (head->next)
{
std::cout << head->next->data << " ";
head = head->next;
}
}
测试代码如下:
int main()
{
ForeachLinkList(CreateLoopLinkList(10));
//ForeachLinkList(CreateLoopLinkList(10), true);
return 0;
}
循环链表循环遍历输出如下:
ForeachLinkList(CreateLoopLinkList(10));
![循环链表](https://i-blog.csdnimg.cn/blog_migrate/5c761a7b84fd6c37d17855ab8e1128a5.gif)
循环链表条件遍历输出如下:
ForeachLinkList(CreateLoopLinkList(10), true)
![循环链表](https://i-blog.csdnimg.cn/blog_migrate/bc729fc9f0e63e3817a52b233561cadf.png)
代码地址:visual studio 2017
https://github.com/USuperMe/LoopLinkList.git
欢迎关注公众号,不定期分享Unity3D、C#、C++数据结构和算法相关的学习知识。