题目描述:
N个人排成一队,从1到5轮流报数,报5的人是幸运者,出列。报到队尾后,从队首接着报,依次循环。
输入N,输出队尾的人是第几名幸运者?
例如:
N=1,输出1
N=2,输出2
N=5,输出1
N=8,输出3
今天帮同学做这题,死活是想不出来,然而等笔试时间过了后,发现这nm这么明显的循环链表,当时楞是想不出来。
大体思路:
建立data从1->N,N长度的循环链表,(幸运者的名数)result=0;遍历链表,每5次就删除第五的结点,若此时第五结点为队尾元素,输出,否则result++;
class Node{
int data;
Node next;
public Node(int data) {
this.data=data;
}
}
public class Main {
public static int selution(int N) {
int result = 0;
//循环链表创建
Node head = new Node(1);
Node temp = head;
for(int i = 2;i <= N;i++) {
temp.next = new Node(i);
temp = temp.next;
}
//temp 初值指向队尾的元素
temp.next = head;
while(true) {
for(int i=0;i < 4;i++) {//为了易于删除,只遍历到第四个元素即可
temp = temp.next;
}
if(temp.next.data != N) {//判断第五个元素是否为队尾元素
temp.next=temp.next.next;
result++;
}else {
return ++result;
}
}
}
}