今天来给大家分享一下unity加载与链表,由于上一讲已经把加载说过了,所以这次我们就来说一下关于链表的问题,主要还是分享一下源代码,如果大家哪里有不懂的地方,可以在社区里面提问,我会及时的做出解答。
Unity 用C#写的链表类
用于保存坐标点
1. using UnityEngine;
2. using System;
3. using System.Collections;
4.
5. /// <summary>
6. /// 结点类
7. namespace CS
8. {
9. /// </summary>
10. public class ListNode
11. {
12. public Vector3 data; //ElemType
13. public ListNode(){} // 构造函数
14. public ListNode next;
15. }
16.
17. /// <summary>
18. /// 链表类
19. /// </summary>
20. public class LinkList{
21.
22. private ListNode first; //第一个结点
23. public LinkList(){
24. first = null;
25. }
26.
27. public bool IsEmpty()
28. {
29. return first == null;
30. }
31.
32.
33. /// <summary>
34. /// 在第k个元素之后插入x
35. /// </summary>
36. /// <param name="k"></param>
37. /// <param name="x"></param>
38. /// <returns></returns>
39. public LinkList Insert( int k, Vector3 x )
40. {
41. if( k<0 )
42. return null;
43. ListNode pNode = first; //pNode将最终指向第k个结点
44. for( int index = 1; index<k && pNode != null; index++ )
45. pNode = pNode.next;
46. if( k>0 && pNode == null )
47. return null;//不存在第k个元素
48. ListNode xNode = new ListNode();
49. xNode.data = x;
50. if( k>0 )
51. {
52. //在pNode之后插入
53. xNode.next = pNode.next;
54. pNode.next = xNode;
55. }
56. else
57. {
58. //作为第一个元素插入
59. xNode.next = first;
60. first = xNode;
61. }
62. return this;
63. }
64.
65. public int Length()
66. {
67. ListNode current = first;
68. int length = 0;
69. while(current != null)
70. {
71. length++;
72. current = current.next;
73. }
74. return length;
75. }
76.
77. /// <summary>
78. /// 返回第k个元素至x中
79. /// </summary>
80. /// <param name="k"></param>
81. /// <param name="x"></param>
82. /// <returns>如果不存在第k个元素则返回false,否则返回true</returns>
83. public bool Find( int k, ref Vector3 x )
84. {
85. if( k<1 )
86. return false;
87. ListNode current = first;
88. int index = 1;
89. while( index<k && current != null )
90. {
91. current = current.next;
92. index++;
93. }
94. if( current != null )
95. {
96. x = current.data;
97. return true;
98. }
99. return false;
100. }
101.
102. /// <summary>
103. /// 返回x所在的位置
104. /// </summary>
105. /// <param name="x"></param>
106. /// <returns>如果x不在表中则返回0</returns>
107. public int Search( Vector3 x )
108. {
109. ListNode current = first;
110. int index = 1;
111. while( current != null && current.data !=x )
112. {
113. current = current.next;
114. index++;
115. }
116. if(current != null)
117. return index;
118. return 0;
119. }
120.
121. /// <summary>
122. /// 删除第k个元素,并用x返回其值
123. /// </summary>
124. /// <param name="k"></param>
125. /// <param name="x"></param>
126. /// <returns></returns>
127. public LinkList Delete( int k, ref Vector3 x )
128. {
129. //如果不存在第k个元素则引发异常
130. if( k<1 || first == null )
131. return null;
132. ListNode pNode = first; //pNode将最终指向第k个结点
133. //将pNode移动至第k个元素,并从链表中删除该元素
134. if( k == 1 ) //pNode已经指向第k个元素
135. first = first.next; //删除之
136. else
137. {
138. //用qNode指向第k-1个元素
139. ListNode qNode = first;
140. for( int index=1; index< k-1 && qNode != null; index++ )
141. qNode = qNode.next;
142. if( qNode == null || qNode.next == null )
143. return null;//不存在第k个元素
144. pNode = qNode.next; //pNode指向第k个元素
145. qNode.next = pNode.next; //从链表中删除第k个元素
146. x = pNode.data;
147. }
148. return this;
149. }
150.
151. // 清空链表
152. public void Clear()
153. {
154. first = null;
155. }
156.
157. }
}