今天来给大家分享一下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.  }  

}