题目描述:
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;
}
}