一.前言
今天在牛客网上面看到了一道环形链表题,想着和大家们分享一下。可能我有点笨,那道题的链接我没搞好,所以很抱歉,只能麻烦大家们看一下截屏的题目信息了。废话不多数,让我们开始今天的题目分享吧。
二.正文
1.1题目描述
1.2题目解析
这是一道环形链表题。
本体虽然没有明确指出但是它默认结构体是:
struct ListNode
{
int val;
ListNode* next;
};
1. 而且这道题没有给你设置好哪怕一个节点,因此我们只能先通过先通过malloc函数自己创建节点。而创建一个环形链表就需要多个节点,为了方便后面使用,因此我写了一个函数BuyNode专门来创建节点。
newnode是我为了接受malloc开辟的那块节点空间的地址。
2. 上面提到我们想要创建一个环形,链表,因此需要多个节点做到首尾相连。为此我定义了一个BuyList函数来创建环形链表。
phead是我们一开始就建立的指向头节点的指针,ptail代表的是尾节点。因为开始ptai=phead(这代表着ptail和phead都指向头节点)
上面右边是左边代码的具现图。
值得注意的是如果没有把最后的尾节点ptail和我们的头节点phead相链接的话,最后具线图将会变成下面这个样子。(下面这个图是错误示范,上面的图才是我们想要的效果)
且该函数返回的是尾节点的地址,即节点5而不是1。这一点很重要!!!
3. 主函数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代码实现
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @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;
}
值得注意的是:这是在牛客环境下运行的代码。
三.结文
今天的分享就到此结束了,帅哥美女们,我们下次再见,拜拜。