循环链表的创建、遍历

循环链表

在单链表中遍历链表时,判断链表终端结点的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));

循环链表

循环链表条件遍历输出如下:

ForeachLinkList(CreateLoopLinkList(10), true)

循环链表

代码地址:visual studio 2017

https://github.com/USuperMe/LoopLinkList.git

欢迎关注公众号,不定期分享Unity3D、C#、C++数据结构和算法相关的学习知识。

码码小虫

  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
节点类型是链表中的元素,每个节点包含数据和指向下一个节点的指针。在C++中,可以通过结构体来定义节点类型,如下所示: ```cpp struct Node { int data; Node* next; }; ``` 其中,data用于存储节点中的数据,next是指向下一个节点的指针。 创建链表可以通过动态分配内存来实现,如下所示: ```cpp Node* head = NULL; // 定义链表头指针 // 创建三个节点并赋值 Node* node1 = new Node; node1->data = 1; node1->next = NULL; Node* node2 = new Node; node2->data = 2; node2->next = NULL; Node* node3 = new Node; node3->data = 3; node3->next = NULL; // 将节点链接起来形成链表 head = node1; node1->next = node2; node2->next = node3; ``` 遍历链表可以通过循环遍历每个节点来实现,如下所示: ```cpp Node* current = head; // 从链表头开始遍历 while (current != NULL) { cout << current->data << " "; // 输出节点数据 current = current->next; // 指向下一个节点 } ``` 完整代码如下: ```cpp #include <iostream> using namespace std; // 定义节点类型 struct Node { int data; Node* next; }; int main() { Node* head = NULL; // 定义链表头指针 // 创建三个节点并赋值 Node* node1 = new Node; node1->data = 1; node1->next = NULL; Node* node2 = new Node; node2->data = 2; node2->next = NULL; Node* node3 = new Node; node3->data = 3; node3->next = NULL; // 将节点链接起来形成链表 head = node1; node1->next = node2; node2->next = node3; // 遍历链表并输出节点数据 Node* current = head; while (current != NULL) { cout << current->data << " "; current = current->next; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值