循环链表

简介:

单向循环链表:

空表:L->next = L。

与单链表的联系:判断表尾的方法不同:单链表用p==NULL;循环链表用p==L。

双向循环链表:一个结点包含指向后继(next) 和指向前驱(prior) 两个指针,两个方向又分别构成循环链表。

双向循环链表的插入和删除:

1.p之后插入s
s->next = p->next;
p->next = s;
s->prior = p;
s->next->prior = s;

2.p之前插入s
s->prior= p->prior;
p->prior = s;
s->next = p;
s->prior->next = s;

3.删除p之后继s
s = p->next;
p->next = s->next;
p->next->prior = p;

4.删除p
p->prior->next= p->next;
p->next->prior= p->prior;

一道题目:循环链表解决Josephus环问题

题目:n个人围成一圈,从第一个开始顺序报数1,2,3,凡是报到3 者退出圈子,最后剩下的就是胜利者。

参考代码:

复制代码
#include <iostream>   
using namespace std;  
  
typedef struct Node  
{  
    int data;  
    struct Node *next;  
}Node,*List;  
  
List Creatlist(int n)  
{  
    List head,p;  
    int i;  
    head=(Node*)malloc(sizeof(Node));  
    if(!head)  
    {  
        cout<<"memory allocation error!\n";  
        exit(1);  
    }  
    head->data=1; head->next=head;  
    for(i=n;i>1;--i)  
    {  
        p=(Node*)malloc(sizeof(Node));  
        if(!p)  
        {  
            cout<<"memory allocation error!\n";  
            exit(1);  
        }  
        p->data=i; p->next=head->next; head->next=p;   
    }  
    return head;  
}  
  
void Output(List head)  
{  
    List p=head;  
    do  
    {  
        cout<<p->data<<" ";  
        p=p->next;  
    }while(p!=head);  
    cout<<endl;  
}  
  
void Play(List head,int n,int m) //第一种方法   
{  
    List p,q;  
    int c,k;  
    p=head; c=1; k=n;  
    while(k>1)  
    {  
        if(c==m-1)  
        {  
            q=p->next; p->next=q->next;  
            cout<<q->data<<" ";  
            free(q);  
            c=0; --k;  
        }  
        else {c++; p=p->next;}  
    }  
    cout<<"The winner is "<<p->data;  
    cout<<endl;  
}  
  
void Josephus(List h,int n,int m)//第二种方法   
{  
    Node* p=h,*pre=NULL;  
    int i,j;  
    for(i=0;i<n-1;++i)  
    {  
        for(j=1;j<m;++j)  
        {  
            pre=p;  
            p=p->next;  
        }  
        cout<<"The out number is"<<p->data<<endl;  
        pre->next=p->next; free(p);  
        p=pre->next;  
    }  
    cout<<"The winner is "<<p->data<<endl;  
}  
  
int main()  
{  
    List head;  
    int n,m;  
    cout<<"Input the n and m :";  
    cin>>n>>m;  
    head=Creatlist(n);  
    Output(head);  
    Josephus(head,n,m);  
  
    return 0;  
}  
复制代码
    本文转自阿凡卢博客园博客,原文链接: http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2622359.html ,如需转载请自行联系原作者
相关文章
|
存储 弹性计算 网络安全
|
监控
阿里云应用性能管理(APM)产品-应用实时监控服务(ARMS)技术解密 资料下载
直播大纲 1. 应用性能管理(APM)背景介绍 2. 分布式链路追踪的现状与使用场景 3. ARMS分布式链路追踪的技术实现 4. 最佳实践 (1) 全息排查+场景链路(2) 前端监控与应用监控融合(3) ARMS与K8S的融合与实践 专家介绍 阳其凯(逸陵),阿里巴巴高级开发工程师,2016年加入阿里巴巴Eageleeye团队,多年实时计算平台与APM产品开发经验,目前主要负责云产品业务实时监控服务(ARMS)与链路追踪(Tracing Analysis)的研发工作。
13527 0
|
9月前
|
前端开发 JavaScript API
HarmonyOS:ArkTS 显式动画 animateTo 自学指南
本文深入解析了 ArkTS 中的 `animateTo` 全局显式动画接口,帮助开发者掌握其使用方法。文章从接口概述、参数详解到使用注意事项,结合实际示例代码,全面展示了如何通过配置 `AnimateParam` 对象实现流畅的动画效果。内容涵盖属性动画、布局变化及组件转场等场景,并强调不同版本的支持特性。适合初学者系统学习,也供进阶开发者参考优化动画体验。希望本文能助你快速上手 `animateTo`!
505 7
|
算法 安全 数据库
数据库死锁的解决方案有哪些?
【10月更文挑战第28天】数据库死锁是数据库管理中的一个常见问题
591 71
|
11月前
|
Perl
|
IDE 编译器 开发工具
C/C++开发环境
C/C++开发环境
312 4
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
288 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
数据采集 存储 监控
99%成功率背后:阿里云短信服务有何优势?
为什么短信会发送失败,如何提高短信发送成功率,本文将为您介绍短信发送成功率和阿里云短信服务如何保障企业短信稳定送达等相关知识。
653 1
99%成功率背后:阿里云短信服务有何优势?
|
Rust JavaScript Java
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
374 0
|
传感器 存储 数据采集
技术好文共享:焕新!CANape19真香!
技术好文共享:焕新!CANape19真香!