typedef struct ListNode ListNode;
//创建新节点
ListNode* buyNode(int x)
{
ListNode* node=(ListNode*)malloc(sizeof(ListNode));
if(node==NULL)
{
exit(1);
}
node->val=x;
node->next=NULL;
return node;
}
//创建环形链表
ListNode* createCircle(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 ) {
// write code here
ListNode* prev=createCircle(n);
ListNode* pcur=prev->next;
int count=1;
while(pcur->next!=pcur)
{
if(count==m)
{
prev->next=pcur->next;
free(pcur);
pcur=prev->next;
count=1;
}else{
prev=pcur;
pcur=pcur->next;
count++;
}
}
return pcur->val;
}
这里是一个环形链表,所以我们要创建环形链表。先创建一个新节点然后让节点首尾相连,让链表成环。
当count等于m时,也就是这时这个节点要销毁。是从pcur这个位置开始的也就是pcur是1,prev是pcur的前一个节点。所以当count=m时要销毁的是pcur这一个节点。让prev连接上pcur的下一个节点,具体实现方式在上面代码中。还有一种情况就是不需要销毁节点,直接让pcur和prev往下走就可以了具体在上面代码。这里while循环的判断条件是pcur->next!=pcur,因为当这个环形链表随着销毁,最后就剩pcur了。