[开心IT面试题] n个数字形成一个圆圈,删除第m个数字,剩下最后一个数字是?

题目:

n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,

每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。

当一个数字删除后,从被删除数字的下一个继续删除第m个数字。

求出在这个圆圈中剩下的最后一个数字。

 

思路:

将n个数字(0,1,…,n-1)形成一个圆圈创建成一个循环链表,一直循环遍历链表,删除第m个数字,

直至剩下一个结点时停止遍历。最后一个结点的data就是剩下最后一个数字。

 

代码:

#include <Windows.h>
#include <iostream>

typedef struct Node
{
    int data;
    struct Node *next;
}Node, *LinkList;

void CreateCircularLinkList(Node* node, int len)
{
    Node *s, *r;
    int elem = 0;
    r = node;
    while(elem < len)
    {
        //建立新结点
        s=(Node*)malloc(sizeof(Node));
        s->data = elem;
        //将s结点插入尾
        r->next = s;
        r = s;
        elem++;
    }
    r->next = node->next;
}

int Delete_RoundElement(Node *node, int index)
{
    if(node == node->next)
    {
        return node->data;
    }
    int pace = 1;
    Node *p,*s;
    p = node->next;
    while(p != p->next)
    {
        pace++;
        if(pace == index)
        {
            s = p->next;
            p->next = p->next->next;
            free(s);
            pace = 0;
        }else
        {
            p = p->next;
        }
    }

    return p->data;
}

int main()
{
    int n = 10;
    int m = 3;
    Node *node;

    //0,1,2,…,n-1建立成循环链表
    CreateCircularLinkList(node, n);

    printf("The last element: %d\n", Delete_RoundElement(node, m));
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值