一個經常碰到的筆試題:一堆小朋友,共有N個,圍成一個圈,每個小朋友遞增地編號,1,2,3,4,......現在,從第一個小朋友開始計數,每數到3的小朋友站出來離開,然后從下一個小朋友開始計數。直到所有的小朋友離開,求小朋友離開的順序編號。
例如:1 2 3 4
【第一次3離開】剩下 1 2 4
【第二次2離開】剩下 1 4
【第三次4離開】剩下 1
........
下面以蘋果代替小朋友,數到3的蘋果被吃掉,輸出被吃的蘋果的編號。
先創建一個蘋果結點類Apple.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace CsharpLinkedList
6 {
7 //一個蘋果結點
8 public class AppleNode
9 {
10 //當前蘋果的信息,用Int32,為空時不出錯
11 public Int32 Apple { get; set; }
12
13 //下一個蘋果
14 public AppleNode Next { get; set; }
15
16 //無參數構造函數,初始化
17 public AppleNode()
18 {
19 //從1開始計數,0表示空
20 this.Apple = 0;
21 //下一結點為空
22 this.Next = null;
23 }
24
25 //傳參數構造函數
26 public AppleNode(Int32 number)
27 {
28 this.Apple = number;
29 this.Next = null;
30
31 }
32
33 //傳參數構造函數
34 public AppleNode(AppleNode node)
35 {
36 this.Apple = node.Apple;
37 this.Next = node.Next;
38 }
39 }
40 }
接着,創建一個操作方法接口IEat.cs(覺得這里有點畫蛇添足了~)
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace CsharpLinkedList
7 {
8 interface IEat
9 {
10 /// <summary>
11 /// 開始啟動
12 /// </summary>
13 void Begin(int num);
14
15 void Work();
16
17 }
18 }
然后,創建一個操作類,EatApple.cs,並實現IEat的接口。
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace CsharpLinkedList
6 {
7 public class EatApple:IEat
8 {
9 //一條鏈表
10 AppleNode allApple=new AppleNode();
11
12 //返回鏈表
13 public AppleNode AllApple
14 {
15 get
16 {
17 return this.allApple;
18 }
19 }
20
21 //鏈表流指針
22 AppleNode point = new AppleNode();
23
24
25 /// <summary>
26 /// 初始化鏈表
27 /// </summary>
28 /// <param name="num">蘋果個數</param>
29 public void Begin(int num)
30 {
31 for (int i = 1; i <=num; i++)
32 {
33 //第一個結點
34 if (allApple == null||allApple.Apple==0)
35 {
36 allApple.Apple = 1;
37 allApple.Next = null;
38 point = allApple;
39 continue;
40 }
41
42 //實例化一個結點
43 AppleNode appleNode = new AppleNode();
44 appleNode.Apple = i;
45 appleNode.Next = null;
46
47 //增加一個結點到鏈表上
48 point.Next = appleNode;
49 point = appleNode;
50 }
51
52 //尾結點的后結點,指向第一個結點
53 point.Next = allApple;
54
55 }
56
57 /// <summary>
58 /// 進行計數,凡是數到3的為符合條件
59 /// </summary>
60 public void Work()
61 {
62 if (allApple.Apple == 0)
63 return;
64
65 //temp指向第一個結點
66 AppleNode temp = new AppleNode(allApple);
67 int count=1;
68
69 while (temp.Apple!=0)
70 {
71 if (count == 3)
72 {
73 //輸出符合的
74 Console.WriteLine(temp.Apple.ToString());
75 //這個符合,標記為刪除
76 temp.Apple = 0;
77 //從下一個開始重新計數
78 count = 0;
79 }
80
81
82 temp = temp.Next;
83
84 //找到下一個滿足條件的結點
85 while(temp.Apple==0)
86 {
87 temp = temp.Next;
88 }
89
90 count++;
91
92 }
93 temp = null;
94
95 allApple = null;
96
97 }
98
99 /// <summary>
100 /// 測試初始化,遍歷鏈表
101 /// </summary>
102 /// <param name="link">輸入一個鏈表</param>
103 public void TestBegin(AppleNode link)
104 {
105 if (link != null&&link.Apple!=0)
106 {
107 AppleNode temp = new AppleNode();
108 temp = link;
109 while (temp.Apple != 0 && temp != null)
110 {
111 Console.WriteLine(temp.Apple.ToString());
112 if (temp.Next != null)
113 temp = temp.Next;
114 else
115 break;
116 }
117 }
118 }
119
120 }
121 }
最后,主函數類Program.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace CsharpLinkedList
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 EatApple eatApple = new EatApple();
13 eatApple.Begin(7);
14 // eatApple.TestBegin(eatApple.AllApple);循環鏈表,死循環
15 eatApple.Work();
16
17 //下面的執行不了
18 object t=Console.ReadLine();
19 Console.WriteLine(t.ToString());
20 }
21 }
22 }
運行結果如下(7個蘋果時):
有個很奇怪的問題,當輸出完畢時,控制窗口就停止響應了。這是什么原因呢?還請各位同學指點。不勝感激哦~
感謝 none2180 的指點!在下一篇關於c#鏈表結構的隨筆中,將修正此Bug。