C语言/数据结构——每日一题(环形链表的约瑟夫问题)

一.前言

今天在牛客网上面看到了一道环形链表题,想着和大家们分享一下。可能我有点笨,那道题的链接我没搞好,所以很抱歉,只能麻烦大家们看一下截屏的题目信息了。废话不多数,让我们开始今天的题目分享吧。

二.正文

1.1题目描述

1.2题目解析

这是一道环形链表题。

本体虽然没有明确指出但是它默认结构体是:

cpp 复制代码
struct ListNode
{
int val;
ListNode* next;
};
  1. 而且这道题没有给你设置好哪怕一个节点,因此我们只能先通过先通过malloc函数自己创建节点。而创建一个环形链表就需要多个节点,为了方便后面使用,因此我写了一个函数BuyNode专门来创建节点。

newnode是我为了接受malloc开辟的那块节点空间的地址。

  1. 上面提到我们想要创建一个环形,链表,因此需要多个节点做到首尾相连。为此我定义了一个BuyList函数来创建环形链表。

phead是我们一开始就建立的指向头节点的指针,ptail代表的是尾节点。因为开始ptai=phead(这代表着ptail和phead都指向头节点)

上面右边是左边代码的具现图。

值得注意的是如果没有把最后的尾节点ptail和我们的头节点phead相链接的话,最后具线图将会变成下面这个样子。(下面这个图是错误示范,上面的图才是我们想要的效果)

且该函数返回的是尾节点的地址,即节点5而不是1。这一点很重要!!

  1. 主函数ysf函数中:我们用prev来接受BuyList传递的5节点指针。pcur是prev的下一个节点,初始pcur指向1节点。count是我们的计数变量,什么时候count==m,pcur代表的这个人就死掉了(代码中是free掉了)

如果count!=m,我们仅仅需要让prev指向pcur所在节点,以及pcur指向下一个节点,并让count++。

否则,即(count==m)那么prev将会指向pcur指向的下一个指针,并且pcur所指向的指针会被free掉,然后pcur指向prev指向的下一个节点。最后不要忘了让count=1重新计数。

依次循环直到不满足条件(pcur->next!=pcur)后,退出循环。

1.3代码实现

cpp 复制代码
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param m int整型 
 * @return int整型
 */
 typedef struct ListNode ListNode;
 ListNode* BuyNode(int x)
 {
    ListNode* newnode=(ListNode*)malloc(sizeof(ListNode));
    if(newnode==NULL)
    {
    return NULL;
    }
    else {
    newnode->next=NULL;
    newnode->val=x;
    return newnode;
    }

 }
 ListNode* BuyList(int n)
 {
    ListNode* phead=BuyNode(1);
ListNode* ptail=phead;
for(int i=2;i<=n;i++)
{
    ptail->next=BuyNode(i);
    ptail=ptail->next;
}
ptail->next=phead;
return ptail;
 }
int ysf(int n, int m ) 
{
    ListNode* prev=BuyList(n);
    ListNode* pcur=prev->next;
    int count=1;
    while((pcur->next)!=pcur)
    {
        if(count!=m)
        {
              prev=pcur;
            pcur=pcur->next;
            count++;
        }
        else {
          
             prev->next=pcur->next;
        free(pcur);
        pcur=prev->next;
        count=1;
        }
        }
        return pcur->val;
    }

值得注意的是:这是在牛客环境下运行的代码。

三.结文

今天的分享就到此结束了,帅哥美女们,我们下次再见,拜拜。

相关推荐
ゞ 正在缓冲99%…28 分钟前
leetcode152.乘积最大子数组
数据结构·算法·leetcode
CYRUS_STUDIO1 小时前
Frida Hook Android Native 函数
android·c语言·逆向
W说编程1 小时前
《UNIX网络编程卷1:套接字联网API》第5章 TCP客户服务器程序示例
c语言·网络·网络协议·tcp/ip·unix·tcp
闯闯爱编程1 小时前
数组与特殊压缩矩阵
数据结构·算法·矩阵
laimaxgg2 小时前
数据结构B树的实现
开发语言·数据结构·c++·b树·算法
灋✘逞_兇4 小时前
链表的操作-反转链表
数据结构·链表
LuckyAnJo7 小时前
Leetcode-100 链表常见操作
算法·leetcode·链表
双叶8368 小时前
(C语言)虚数运算(结构体教程)(指针解法)(C语言教程)
c语言·开发语言·数据结构·c++·算法·microsoft
快来卷java10 小时前
MySQL篇(一):慢查询定位及索引、B树相关知识详解
java·数据结构·b树·mysql·adb
序属秋秋秋11 小时前
算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
c语言·c++·学习·算法