循环链表

循环链表是一种特殊的单链表,其中尾结点的指针指向首结点,形成逻辑上的环。本文介绍了循环链表的实现思路,包括通过模板定义CircleList类,首尾相连的操作,以及特殊处理的插入和删除操作。此外,还讨论了如何使用循环链表解决约瑟夫环问题。
摘要由CSDN通过智能技术生成

循环链表在概念就是任意数据元素都有一个前驱和一个后继(与单链表不同的重点,单链表首结点没有前驱而尾结点没有后继),所有的数据元素的关系构成一个逻辑上的环,在实现上,循环链表是一种特殊的单链表,其尾结点的指针域保存了首结点的地址,如下图所示
在这里插入图片描述
循环链表的实现思路
通过模板定义CircleList类,继承自LinkList单链表类
定义内部函数last_to_first(),用于将单链表首尾相连
特殊处理:首元素的插入操作和删除操作
重新实现:清空操作和遍历操作
要点:
1.插入位置为0时,头结点和尾结点均指向新结点,新结点指向原先的首结点成为首结点插入链表
先插入元素,如果该元素是0号元素则记得把尾结点连上
2.删除位置为0时,头结点和尾结点指向位置为1的结点,安全销毁原来的首结点
先是删除结点是否为0号元素,如果为0号元素则删除后记得判断是否长度大于,大于0的话则尾结点连上首结点

以下代码是CircleList.h的实现

#ifndef CIRCLELIST_H
#define CIRCLELIST_H
#include "LinkList.h"
namespace CGSLib
{
   
   template <typename T>
   class CircleList : public LinkList<T>
   {
   
      protected:
      typedef typename LinkList<T>::Node Node;  //使用typedef巧妙应用重新给父类的Node结点 命名
      /*因为是循环链表所以要取模函数*/
      int mod(int i)
      {
   
          return (this->m_length==0)?0:(i%this->m_length);
      }
      /*将尾结点连接到首结点*/
      void  last_to_first()const
      {
   
          last()->next = this->m_header.next;
      }
      /*找到尾结点*/
      Node* last()const
      {
   
           return this->position(this->m_length-1)->next;
      }
      public:
      /*插入函数*/
      bool instert(const T &e)
      {
   
          return instert(this->m_length,e);
      }
      bool instert(int i,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值