單向鏈表數據結構是有節點組成,每個節點包含兩部分,第一部分為存儲數據,
第二部分為指向下一個節點的指針。注意,有兩個特色的節點,分別為“頭節點”
和“尾節點”,頭節點本身沒有數據,只存儲下一個節點的指針,尾節點只存數據
1 //節點類 2 public class ListNode 3 { 4 public ListNode(int NewValue) 5 { 6 Value = NewValue; 7 } 8 //前一個 9 public ListNode Previous; 10 //后一個 11 public ListNode Next; 12 //值 13 public int Value; 14 15 16 } 17 //鏈表類 18 public class Clist 19 { 20 public Clist()//構造函數 21 { 22 //初始化 23 ListCountValue = 0; 24 Head = null; 25 Tail = null; 26 } 27 private ListNode Head;//頭指針 28 private ListNode Tail;//尾指針 29 private ListNode Current;//當前指針 30 private int ListCountValue;//鏈表數據的個數 31 //向尾部添加數據方法 32 public void Append(int DataValue) 33 { 34 ListNode NewNode = new ListNode(DataValue); 35 36 if (IsNull())//如果頭指針為空 37 { 38 Head = NewNode; 39 Tail = NewNode; 40 } 41 else 42 { 43 Tail.Next = NewNode; 44 NewNode.Previous = Tail; 45 Tail = NewNode; 46 } 47 Current = NewNode; 48 ListCountValue += 1;//鏈表個數加 1 49 } 50 public void Delete() 51 { 52 if (!IsNull())//若為空鏈表 53 { 54 if (!IsBof())//若刪除頭 55 { 56 Head = Current.Next; 57 Current = Head; 58 ListCountValue -= 1; 59 return; 60 } 61 if (!IsEof())//若刪除尾 62 { 63 Tail = Current.Previous; 64 Current = Tail; 65 ListCountValue -= 1; 66 return; 67 } 68 Current.Previous.Next = Current.Next;//若刪除中間數據 69 Current = Current.Previous; 70 ListCountValue -= 1; 71 return; 72 } 73 } 74 //向后移動一個數據的方法 75 public void MoveNext() 76 { 77 if (!IsEof()) Current = Current.Next; 78 } 79 //向前移動一個數據的方法 80 public void MovePrevious() 81 { 82 if (!IsBof()) Current = Current.Previous; 83 } 84 //移動到第一個數據方法 85 public void MoveFrist() 86 { 87 Current = Head; 88 } 89 //移動到最后一個數據方法 90 public void MoveLast() 91 { 92 Current = Tail; 93 } 94 //判斷是否為空鏈表方法 95 public bool IsNull() 96 { 97 if (ListCountValue == 0) 98 return true; 99 return false; 100 } 101 //判斷是否為到達尾部方法 102 public bool IsEof() 103 { 104 if (Current == Tail) 105 return true; 106 return false; 107 } 108 //判斷是否為到達頭部方法 109 public bool IsBof() 110 { 111 if (Current == Head) 112 return true; 113 return false; 114 } 115 //取得當前結點的值方法 116 public int GetCurrentValue() 117 { 118 return Current.Value; 119 } 120 //取得鏈表的數據個數方法 121 public int ListCount 122 { 123 get { return ListCountValue; } 124 } 125 //清空鏈表方法 126 public void Clear() 127 { 128 MoveFrist(); 129 while (!IsNull()) 130 { 131 Delete();//若不為空鏈表,從尾部刪除 132 } 133 } 134 //在當前位置前輸入數據方法 135 public void Insert(int DataValue) 136 { 137 ListNode NewNode = new ListNode(DataValue); 138 if (IsNull()) 139 { 140 Append(DataValue);//為空表,則添加 141 return; 142 } 143 if (IsBof()) 144 { 145 //為頭部插入 146 NewNode.Next = Head; 147 Head.Previous = NewNode; 148 Head = NewNode; 149 Current = Head; 150 ListCountValue += 1; 151 return; 152 } 153 //中間插入 154 NewNode.Next = Current; 155 NewNode.Previous = Current.Previous; 156 Current.Previous.Next = NewNode; 157 Current = NewNode; 158 ListCountValue += 1; 159 } 160 //進行升序插入方法 161 public void InsertAscending(int InsertValue) 162 { 163 //參數:InsertValue 插入的數據 164 //為空鏈表 165 if (IsNull()) 166 { 167 //添加 168 Append(InsertValue); 169 return; 170 } 171 MoveFrist();//移動到頭 172 if ((InsertValue < GetCurrentValue())) 173 { 174 Insert(InsertValue);//滿足添加,則插入 175 return; 176 } 177 while (true) 178 { 179 if (InsertValue < GetCurrentValue()) 180 { 181 //滿足條件,則插入,退出 182 Insert(InsertValue); 183 break; 184 } 185 if (IsEof()) 186 {//從尾部插入 187 Append(InsertValue); 188 break; 189 } 190 //移動到下一個指針 191 MoveNext(); 192 } 193 } 194 195 //進行降序插入方法 196 public void InsertUnAscending(int InsertValue) 197 { 198 //參數:InsertValue 插入的數據 199 //為空鏈表 200 if (IsNull()) 201 { 202 //添加 203 Append(InsertValue); 204 return; 205 } 206 //移動到頭 207 MoveFrist(); 208 if (InsertValue > GetCurrentValue()) 209 { 210 //滿足條件,則插入,退出 211 Insert(InsertValue); 212 return; 213 } 214 while (true) 215 { 216 if (InsertValue > GetCurrentValue()) 217 { 218 //滿足條件,則插入,退出 219 Append(InsertValue); 220 break; 221 } 222 if (IsEof()) 223 { 224 //尾部添加 225 Append(InsertValue); 226 break; 227 } 228 //移動到下一個指針 229 MoveNext(); 230 } 231 232 } 233 }
