Acwing82.圆圈中最后剩下的数字

题目描述:
0,1,…,n−1 这 n 个数字 (n>0) 排成一个圆圈,从数字 0 开始每次从这个圆圈里删除第 m 个数字。
求出这个圆圈里剩下的最后一个数字。

示例:

输入:n=5 , m=3
输出:3

算法思路:
本题中要想在圆圈里删除数字,那么就需要先将这几个数字围起来,那么就考虑到可以使用循环链表,这里我采用定义一个Node结点,其val存储的是数字本身的值,next指针域存放的是下一个带有数字值的Node结点,然后定义一个start指针,来进行遍历,每次start停在要删除的结点上一个,然后删除完对应的指针后需要将start指针移动一位到删除的指针后一位。

算法实现:

class Solution {
    
    
    public int lastRemaining(int n, int m) {
    
    
        if(n==1){
    
    
            return 0;
        }
        //当n大于1的时候
        //循环链表的删除的终点是当前结点的next还是自身
        //定义一个node结点用来表示上一个结点
        Node last_node = new Node();
        Node node0 = new Node(0,null);
        //更新上一个结点
        last_node = node0;
        for(int i=1;i<n;i++){
    
    
            Node node_now = new Node(i,null);
            last_node.next = node_now;
            //更新上一个结点
            last_node = node_now;
        }
        //构造循环链表
        last_node.next = node0;
        
        //从0开始进行循环删除链表
        Node start = node0;
        while(start.next!=start){
    
    
            //从起始位置开始删除第m个元素
            //找到第m-1个元素
            for(int i=1;i<m-1;i++){
    
    
                //start指向当前指针的下一个结点
                start = start.next;
            }
            //删除第m个元素
            start.next = start.next.next;
            //start要从被删除的下一个开始
            start = start.next;
        }
        //最后只有一个结点,返回结果
        return start.val;
    }
}
class Node{
    
    
    public int val;
    public Node next;
    public Node(){
    
    
        
    }
    public Node(int val,Node next){
    
    
        this.val = val;
        this.next = next;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_56068397/article/details/123328142
今日推荐