1. 程式人生 > >藍橋杯猜字母用單向連結串列實現

藍橋杯猜字母用單向連結串列實現

標題:猜字母

把abcd...s共19個字母組成的序列重複拼接106次,得到長度為2014的串。

接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。

得到的新串再進行刪除奇數位置字母的動作。如此下去,最後只剩下一個字母,請寫出該字母。

答案是一個小寫字母,請通過瀏覽器提交答案。不要填寫任何多餘的內容。

/*1.用1~2014的數字來填進結點中 2.迴圈,若結點資料時奇數就刪除掉該節點 3.遍歷結點個數allnumber 4.將剩下的結點重新從1到allnumber賦值 5.迴圈直到連結串列長度為1*/ //結點裡面既能存數字,又能存字母,字母是不變的,每個結點對應的數字可變

class Dnode{ int data; char ch; Dnode next; } /*1.將19個字母,106組用迴圈存進數組裡面,長度為2014 2.構建新連結串列,將1~2014賦給連結串列的每個元素 3、將陣列的每個字母賦給對應的結點*/ class mList{ String str="abcdefghijklmnopqrs"; Dnode head=new Dnode(); Dnode tail=head; Dnode ptr; void createList(){ int j=1; while (j<=2014){ ptr=new Dnode(); ptr.data=j;
tail.next=ptr;
ptr.next=null;
tail=ptr;
j++;
}
		
int count=0;
int i=0;
Dnode ptr=head.next;
while (i<=19){
if (i==19){
i=0;
}
if (count==2014){
break;
}
ptr.ch=str.charAt(i);
ptr=ptr.next;
count ++;
i ++;
			
}
		
}
/*1.刪除結點之前,先按順序重新給結點賦數字
2.遍歷連結串列,若是奇數,就刪除該節點*/
void deleteList(){
//int all=ergodic();
//從1開始重新賦值
int i=1;
Dnode myNode=head.next;
while (myNode!=null){
myNode.data=i;
myNode=myNode.next;
i++;
}
		
myNode=head;
while (myNode!=null&&myNode.next!=null){
if (myNode.next.data%2!=0){
myNode.next=myNode.next.next;
			
myNode=myNode.next;
			
}
		
		
}
	
//遍歷結點個數
int ergodic(){
Dnode myNode=head.next;
int count=0;
while (myNode!=null){
count++;
myNode=myNode.next;
}
return count;
}
	
void printList(){
Dnode myNode=head.next;
while (myNode!=null){
System.out.print(myNode.ch+",");
System.out.println(myNode.data+"");
			
myNode=myNode.next;
}
}
}
public class Guess {


public static void main(String[] args) {
// TODO Auto-generated method stub
int time=1;
mList li=new mList();
li.createList();
System.out.println("第一次輸出:");
li.printList();
System.out.println("第一次輸出結束!");
//迴圈刪除元素,縮短連結串列,直到只剩下一個結點
do {
System.out.println("第"+time+"次輸出:");
li.deleteList();
li.printList();
time ++;
if (li.ergodic()==1){
System.out.println("所得的字母是"+li.head.next.ch+"");
}
}while (li.ergodic()!=1);
}


}