2020年6月6日重溫代碼:
public class LinkQueue {
Node head;
Node tail;
int size;
//造環
public Node createNodeCircle(int len){
if(len == 0) return null;
for(int i = 0 ; i < len;i++){
Node node = new Node(null,i);
if(i == 0){
node.next = node;
head = node;
tail = node;
}else{
node.next = tail.next;
tail.next = node;
tail = node;
}
}
return head;
}
// start 開始位置,deathNumber 死亡數字,playersNumber 玩家人數
public int alive(int start,int deathNumber,int playersNumber){
Node node = createNodeCircle(playersNumber);
Node startNode = node;
for(int i = 0;i < start-1; i++){
startNode = startNode.next;
}
int count = 1;
while(startNode!=null && startNode.next!=startNode){
if(count == deathNumber-1){
System.out.println("death"+startNode.next.value);
startNode.next = startNode.next.next;
count = 1;
}else{
count++;
}
startNode = startNode.next;
}
return startNode.value;
}
public static void main(String[] args) {
LinkQueue l = new LinkQueue();
System.out.println(l.alive(2, 3, 7));
}
}
//之前的
public class lianbiao2 {
class Node{
Node next;
int number;
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(int i) {
this.number = i;
}
public Node(Node next, int number) {
this.next = next;
this.number = number;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
public Node firsetnode;
public Node tempNode;
int len;
/**
* 造環的關鍵是:
* 再生成第一個Node的時候,讓兩個引用(firsetnode和tempNode)指向他,之后循環時,每次通過tempNode引用操作尾結點,將新生成的節點加上
* 當長度夠后,將新生成的節點的 next 指向開始就一直沒變的 firsetnode的引用,也就是指向了第一一個生成的節點,完成 環狀
*/
public void setcrcle(int length){
for(int i=1;i<=length;i++){
Node node = new Node(i);
if(i==1){
firsetnode = node;
tempNode = node;
}else{
if(i != length){
tempNode.next= node;
tempNode = node;
}else{
tempNode.next=node;
node.next = firsetnode;
}
}
len++;
}
System.out.println(len);
}
public int play(int keillNumber){
return play(1,keillNumber);
}
/**
* 先找到開始節點。
* 從開始節點開啟循環,遍歷整個環,退出條件是,tempNode沒有后續了 且 不等於自身
* 實現循環 后,當count等於死亡數字,直接刪除下一個節點,count重新置1
*
*
* @param start 開始位置
* @param killNumber 死亡數字
* @return
*/
public int play(int start,int killNumber){
int count =1;
Node tempNode = firsetnode;
for(int i = 1;i<start;i++){
tempNode= firsetnode.next;//找到初始節點
}
while(tempNode.next != null && tempNode.next !=tempNode){
if(count != killNumber-1){
count++;
tempNode=tempNode.next;//實現循環
}else{
System.out.println("死的是"+tempNode.next.getNumber());
tempNode.next=tempNode.next.next;//直接刪除下一個節點
tempNode= tempNode.next;//實現循環
count=1;
}
}
return tempNode.getNumber();
}
public static void main(String[] args) {
lianbiao2 l =new lianbiao2();
l.setcrcle(10);
System.out.println("存活的是"+l.play(2,5));;
}
}