题目:n个人围成一圈,从第1个人开始报数,每报到第m个人,则其出局,求最后出局的人的初始序号
思路:通过建立单向循环链表实现,每次删除第m个节点,记录该节点的下一节点,从该节点开始从新数数。
package huaweiicomeagain;
import huaweiicomeagain.GameNum.ListNode;
/**
* n个人围成一圈,从第1个人开始报数,每报到第m个人,则其出局,求最后出局的人的初始序号
* @author huanghuankun
*
*/
public class GameNum {
//定义链表结构,需要定义为static
static class ListNode{
String value;
ListNode next;
ListNode(){//默认构造函数
}//初始化构造函数
ListNode(String data){
this.value = data;
}
}
//初始化循环链表
private static ListNode initListNode(String str){
ListNode head = new ListNode();
head.value = String.valueOf(str.charAt(0));
head.next = head;
ListNode p = head;
for(int i=1;i<str.length();i++){
ListNode newNode = new ListNode();
newNode.value = String.valueOf(str.charAt(i));
p.next = newNode;
p = p.next;
}
p.next = head;
return head;
}
//删除节点,出圈
private static void delListNode(ListNode head,int num){
ListNode first = head;
while(first!=first.next){//循环链表结束条件
for(int i=1;i<num-1;i++){//前驱节点
first = first.next;
}
System.out.print(first.next.value);
first.next = first.next.next;
first = first.next;
}
System.out.print(first.value);//最后一个节点
}
public static void main(String[] args){
String str = "abcdefghijklmnopqrstuvwxyz";
int num = 2;
System.out.println(str);
ListNode head = initListNode(str);
delListNode(head,num);
}
}
测试:
abcdefghijklmnopqrstuvwxyz
bdfhjlnprtvxzcgkoswaiqymeu