雙向迴環鏈表在面向對象中的應用

package com.zhanglei.two_way_linked_list;

public class Count3Quit {
final static int THREE=3;

/**
* 100人圍成一圈,數數,數到3的退出,下我的接着數,求最後一個退出的人的編號
* POP面向過程的寫法(只是算法級別)
* OOP面向對象編程(面向對象級別)-------------------------經典啊,強烈推薦,雙向迴環鏈表
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

//POP();
OOP();

}
/*
* kc建立一個500Kid的Circle
* k=kc.first
* k=k.right一下下向下移動,計數到3,kc.delete(k)刪除k,開始下一輪計數
* 最後留下kc只有一個Kid
*/
public static void OOP() {
KidCircle kc=new KidCircle(500);
int count=0;
Kid k=kc.first;
while(kc.count>1) {
count++;
if(count==THREE) {
count=0;
kc.delete(k);
}
k=k.right;
}
System.out.println(kc.first.id);
}

public static void POP() {//面向過程的寫法Process-orinted Programing
int[] a = new int[100];
for (int i = 0; i < a.length; i++) {
a[i] = 1;
}

/*
* leftCount餘下的人數,index編號,count計數器
* a[index]==1表示還在圈內,爲0表示出圈
*/
int leftCount = a.length;
int index = 0;
int count = 0;

while (leftCount > 1) {
if (a[index] == 1) {
count++;
if (count == THREE) {
count = 0;
a[index] = 0;
leftCount--;
}
}
index++;
if(index==a.length) {
index=0;
}
}
for(int j=0; j<a.length; j++){
if(a[j]==1){
System.out.println(j);
}
}
}
}


class Kid {
int id;
Kid left;
Kid right;
}

class KidCircle {
int count;
Kid first;
Kid last;
KidCircle(int kidNum) {
for(int i=0; i<kidNum; i++){
add();
}
}
void add(){
Kid k=new Kid();
k.id=count;
if(count<=0) {
first=k;
last=k;
k.left=k;
k.right=k;
} else {
last.right=k;
first.left=k;
k.left=last;
k.right=first;
last=k;
}
count++;
}
void delete(Kid k) {
if(count<=0) {
return;
} else if(count==1) {
first=last=null;
} else {
k.left.right=k.right;
k.right.left=k.left;
if(k==first) {
first=k.right;
} else if(k==last) {
last=k.left;
}
}
count--;
}
}
相關文章
相關標籤/搜索