【概述】

循环链表的构建与单链表十分相似,唯一不同的是,对于链表的表尾,需要将原来的 NULL 改为 first

以下仅给出构造函数的实现

【构造函数】

1.无参构造函数

生成一个头结点,让头指针指向头结点,并将头结点的指针域指向头指针。

template <class T>
linkList<T>::circleList(){//无参构造函数first=new Node<T>;//头指针指向头结点first->next=first;//头结点的指针域指向头指针
}

2.有参构造函数

1)头插法

使用头插法的有参构造函数,构造循环链表的主体部分与单链表一致,区别在于要在一开始令头结点指向头指针,即 first->next=first

template <class T>
linkList<T>::circleList(T a[],int n){//头插法的有参构造函数first=new Node<T>;first->next=first;//头结点指向头指针//与单链表一致for(int i=0;i<n;i++){Node<T> *s=new Node<T>;s->data=a[i];s->next=first->next;first->next=s;}
}

2)尾插法

使用尾插法的有参构造函数,构造循环链表的主体部分与单链表一致,区别在于建表完毕后要将尾指针指回头结点,即 r->next=first

template <class T>
linkList<T>::circleList(T a[],int n){//尾插法的有参构造函数first=new Node<T>;Node<T> *r=first;for(int i=0;i<n;i++){Node<T> *s=new Node<T>;s->data=a[i];r->next=s;r=s;}r->next=first;//将尾指针指回头结点
}

【经典应用】

循环链表能解决许多问题,其中,最经典的,就是对于约瑟夫环问题的解决

约瑟夫环是一个数学的应用问题:已知 n 个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围,从编号为 k 的人开始报数,数到 m 的那个人出列,他的下一个人又从 1 开始报数,数到 m 的那个人又出列,依此规律重复下去,直到圆桌周围的人全部出列,问最后剩下的那个人的编号

解决:使用不带头指针的循环链表即可解决,将初始编号加入循环链表后,开始寻找报数起点,然后从报数起点开始,报数循环到第 m-1 个点,最后将 m-1 号点之后的 m 号点从循环链表中删除即可,重复寻找 m-1 号点删除 m 号点,直到剩下一个结点。

struct Node{int data;Node *next;
};
int main(){int n,m,k;cin>>n>>m>>k;Node *first=new Node;//头指针first->data=1;Node *p=first;//工作指针for(int i=2;i<=n;i++){Node *s=new Node;//新建节点s->data=i;p->next=s;p=p->next;}p->next=first;//链表尾端指向链表头,构成循环链表p=first;for(int i=1;i<=k-1;i++)//寻找报数起点p=p->next;while(p!=p->next){//只剩下一个结点时for(int i=1;i<m-1;i++)//循环报数到m之前的一个结点p=p->next;Node *q=p->next;//第m个元素即要出环的元素p->next=q->next;//摘链delete q;//删除出换元素p=p->next;//继续指向下一元素}cout<<(p->data)<<endl;return 0;
}

理论基础 —— 线性表 —— 循环链表相关推荐

  1. 线性表----循环链表和静态链表

    1.循环链表 1.1 循环单链表 循环单链表和单链表的区别在于,表中最后一个结点指针不在是null,而是头指针,从而使整个链表形成一个环 此时判断单链表是否为空,条件就是头结点的指针是否等于头指针 此 ...

  2. 理论基础 —— 线性表

    [逻辑结构] 线性表是零或多个数据元素组成的有限序列,其中,数据元素的个数定义为线性表的长度,当长度为 0 时称为空表,反之称为非空表. 一个非空表常记为:,其中 ai 是表中的第 i 个数据元素,表 ...

  3. 理论基础 —— 线性表 —— 单链表

    [实现类] 单链表的基本思想就是用指针表示结点之间的逻辑关系,因此要正确的对指针变量.指针.指针所指结点.结点的值进行区分. 设 p 是一个指针变量,则 p 的值是一个指针,若指针 p 指向某个 No ...

  4. 2.3线性表——循环链表和双向链表基本操作的实现

    注意:以下内容均省略思路,只有代码和时间复杂度.此内容为本人学习过程中的一些学习记录,如有错误,恳请各位指正.建议,末学将感激不尽! 目录 1.两个循环链表的合并 2.双向链表的结构定义 3.双向链表 ...

  5. 理论基础 —— 线性表 —— 双向链表

    [实现类] template <class T> struct Node{//结点T data;//数据域Node *llink;//左指针Node *rlink;//右指针 };temp ...

  6. 理论基础 —— 线性表 —— 顺序表

    [实现类] const int maxSize=100;//存储空间初始分配量 template <class T> class SeqList{ private:T data[maxSi ...

  7. 2021-9-下旬 数据结构 - 线性表 - 循环链表 - java实现代码(复习用)

    public class CycleLinkedListZH<E> {public static final int ELEMENT_NOT_FOUND = -1;private int ...

  8. 数据结构与算法:06 线性表

    06 线性表 知识结构: 1. 线性表的定义与操作 1.1 线性表的定义 线性表(Linear List)是由n(n≥0)n (n≥0)n(n≥0)个相同类型的数据元素a0,a1,⋯,an−1a_0, ...

  9. 数据结构——线性表:顺序表、单向链表、循环链表、双向链表

    线性表   是一种数据结构:n个数据元素的有限序列 表示形式: L = (a1,a2...an) a1是线性表的元素,小写. n=0时候为空表 数据元素具有相同特性 相邻元素之间存在序偶关系:即有唯一 ...

最新文章

  1. layerconfirm确认框的使用
  2. winlogon.exe错误:小心设置搜狗拼音输入法
  3. NIO中的SelectionKey
  4. matlab中矩阵的左除右除
  5. [20161208]等待事件enq: HW - contention
  6. 日立预计08财年亏损78亿美元 将裁员7千人
  7. java ee ide 添加spring,如何在Eclipse IDE项目文件夹中为spring添加jar文件
  8. 【LeetCode笔记】309. 最佳买卖股票时机含冷冻期(Java、动态规划)
  9. 软考高项信息系统项目管理工程师自考500元搞定攻略
  10. C基础06天--字符串
  11. MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE
  12. [HTML] 表单和输入
  13. java random()_JAVA的Random类的用法详解
  14. excel、doc等office文件转pdf方法总结
  15. jaxen.jar下载地址
  16. 最拼命最努力的时候(转)
  17. java的八大基本类型
  18. C++程序设计原理与实践 习题答案 第二十六章 第26章习题答案
  19. 机器人开发--设计范式
  20. Linux之 prefix 命令

热门文章

  1. 谁说IT男没有审美?怀揣5000元巨款,我们这样改变生活
  2. 给你多少钱,你才会愿意为国家生孩子?
  3. html中dom多会有影响吗,DOM操作造成的页面卡顿问题及解决
  4. php中的strncmp,PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
  5. php版本个版本区别,PHP版本不一样有什么区别
  6. java读取mxl_Dom4j 读取一个XML文件和将String写成XML文件 | 学步园
  7. Nginx的这些妙用,你肯定有不知道的!
  8. 骆俊武:五年了,我的技术管理成长之路
  9. 探秘蚂蚁金服分布式事务 Seata 的AT、Saga和TCC模式
  10. 假如把支付宝存储服务器炸了,里面的钱还在么?