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;
    }

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

三.结文

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

相关推荐
XuanRanDev25 分钟前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
代码猪猪傻瓜coding26 分钟前
力扣1 两数之和
数据结构·算法·leetcode
EricWang13581 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??1 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
南宫生2 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
希言JY2 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
午言若2 小时前
C语言比较两个字符串是否相同
c语言
weixin_432702263 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
passer__jw7673 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
TeYiToKu4 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm