c# 数据结构 ---双链表
再来个双链表,其实和单链表差不多拉,循环链表也是,只是把尾元素指向Header就OK了。所以就不贴循环链表了。
1 /// <summary>
2 /// 双链表的节点
3 /// </summary>
4 public class DoubleLinkNode
5 {
6 private object _data;//存储数据
7 private DoubleLinkNode _rLink; //存储右表的指针
8 private DoubleLinkNode _lLink; //存储左边的指针
9
10 public object Data
11 {
12 get { return _data; }
13 set { _data = value; }
14 }
15
16
17 public DoubleLinkNode LLink
18 {
19 get { return _lLink; }
20 set { _lLink = value; }
21 }
22
23 public DoubleLinkNode RLink
24 {
25 get { return _rLink; }
26 set { _rLink = value; }
27 }
28
29
46 }
47
48
49/// <summary>
50 /// 双链表
51 /// </summary>
52 public class DoubleLinkList
53 {
54 /// <summary>
55 /// 头节点
56 /// </summary>
57 DoubleLinkNode header;
58
59 public DoubleLinkList()
60 {
61 header = new DoubleLinkNode("header");
62 header.LLink = null;
63 header.RLink = null;
64 }
65
66
67
68 /// <summary>
69 /// 双链表的查找
70 /// </summary>
71 /// <param name="i">节点位置</param>
72 /// <returns>找到的节点</returns>
73 public DoubleLinkNode FindIndex(int i)
74 {
75 if (i == -1 | i == 0) return header;
76
77 DoubleLinkNode resultNode = header.RLink;
78
79 int j = 1;
80 while (resultNode != null && j < i)
81 {
82 resultNode = resultNode.RLink;
83 j++;
84 }
85
86 return resultNode;
87 }
88
89
90 /// <summary>
91 /// 数据的插入
92 /// </summary>
93 /// <param name="data">要插入的数据</param>
94 /// <param name="i">插入位置</param>
95 /// <returns>返回插入后的节点</returns>
96 public DoubleLinkNode Insert(Object data, int i)
97 {
98 DoubleLinkNode newNode,currentNode;
99 newNode = new DoubleLinkNode(data);
100 currentNode = FindIndex(i - 1);
101 if (currentNode.RLink == null)
102 {
103 currentNode.RLink = newNode;
104 newNode.LLink = currentNode;
105 }
106 else
107 {
108 newNode.RLink= currentNode.RLink;
109 newNode.LLink = currentNode;
110 currentNode.RLink = newNode;
111 }
112
113 return newNode;
114 }
115
116 /// <summary>
117 /// 删除所传入节点的下一个节点
118 /// </summary>
119 /// <param name="node"></param>
120 public void DeleteAfter(DoubleLinkNode node)
121 {
122 if (node.RLink != null && node != null)
123 {
124 //注意此处顺序不能颠倒。
125 //先给要删除节点的下一个节点的左link赋值,再给要删除节点的前一个节点的右link赋值
126 node.RLink.RLink.LLink = node.RLink.LLink;
127 node.RLink = node.RLink.RLink;
128 }
129 }
130
131 /// <summary>
132 /// 删除指定位置的节点
133 /// </summary>
134 /// <param name="i"></param>
135 public void DeleteNode(int i)
136 {
137 DoubleLinkNode node = FindIndex(i - 1);
138
139 //注意此处顺序不能颠倒。
140 //先给要删除节点的下一个节点的左link赋值,再给要删除节点的前一个节点的右link赋值
141 node.RLink.RLink.LLink = node.RLink.LLink;
142 node.RLink = node.RLink.RLink;
143 }
144
145
146 /// <summary>
147 /// 计算双链表的长度(包括表头节点)
148 /// </summary>
149 /// <returns>长度</returns>
150 public int Length()
151 {
152 DoubleLinkNode node = header;
153 int count = 0;
154
155 while (node != null)
156 {
157 node = node.RLink;
158 count++;
159 }
160 return count;
161 }
162
163 }
2 /// 双链表的节点
3 /// </summary>
4 public class DoubleLinkNode
5 {
6 private object _data;//存储数据
7 private DoubleLinkNode _rLink; //存储右表的指针
8 private DoubleLinkNode _lLink; //存储左边的指针
9
10 public object Data
11 {
12 get { return _data; }
13 set { _data = value; }
14 }
15
16
17 public DoubleLinkNode LLink
18 {
19 get { return _lLink; }
20 set { _lLink = value; }
21 }
22
23 public DoubleLinkNode RLink
24 {
25 get { return _rLink; }
26 set { _rLink = value; }
27 }
28
29
46 }
47
48
49/// <summary>
50 /// 双链表
51 /// </summary>
52 public class DoubleLinkList
53 {
54 /// <summary>
55 /// 头节点
56 /// </summary>
57 DoubleLinkNode header;
58
59 public DoubleLinkList()
60 {
61 header = new DoubleLinkNode("header");
62 header.LLink = null;
63 header.RLink = null;
64 }
65
66
67
68 /// <summary>
69 /// 双链表的查找
70 /// </summary>
71 /// <param name="i">节点位置</param>
72 /// <returns>找到的节点</returns>
73 public DoubleLinkNode FindIndex(int i)
74 {
75 if (i == -1 | i == 0) return header;
76
77 DoubleLinkNode resultNode = header.RLink;
78
79 int j = 1;
80 while (resultNode != null && j < i)
81 {
82 resultNode = resultNode.RLink;
83 j++;
84 }
85
86 return resultNode;
87 }
88
89
90 /// <summary>
91 /// 数据的插入
92 /// </summary>
93 /// <param name="data">要插入的数据</param>
94 /// <param name="i">插入位置</param>
95 /// <returns>返回插入后的节点</returns>
96 public DoubleLinkNode Insert(Object data, int i)
97 {
98 DoubleLinkNode newNode,currentNode;
99 newNode = new DoubleLinkNode(data);
100 currentNode = FindIndex(i - 1);
101 if (currentNode.RLink == null)
102 {
103 currentNode.RLink = newNode;
104 newNode.LLink = currentNode;
105 }
106 else
107 {
108 newNode.RLink= currentNode.RLink;
109 newNode.LLink = currentNode;
110 currentNode.RLink = newNode;
111 }
112
113 return newNode;
114 }
115
116 /// <summary>
117 /// 删除所传入节点的下一个节点
118 /// </summary>
119 /// <param name="node"></param>
120 public void DeleteAfter(DoubleLinkNode node)
121 {
122 if (node.RLink != null && node != null)
123 {
124 //注意此处顺序不能颠倒。
125 //先给要删除节点的下一个节点的左link赋值,再给要删除节点的前一个节点的右link赋值
126 node.RLink.RLink.LLink = node.RLink.LLink;
127 node.RLink = node.RLink.RLink;
128 }
129 }
130
131 /// <summary>
132 /// 删除指定位置的节点
133 /// </summary>
134 /// <param name="i"></param>
135 public void DeleteNode(int i)
136 {
137 DoubleLinkNode node = FindIndex(i - 1);
138
139 //注意此处顺序不能颠倒。
140 //先给要删除节点的下一个节点的左link赋值,再给要删除节点的前一个节点的右link赋值
141 node.RLink.RLink.LLink = node.RLink.LLink;
142 node.RLink = node.RLink.RLink;
143 }
144
145
146 /// <summary>
147 /// 计算双链表的长度(包括表头节点)
148 /// </summary>
149 /// <returns>长度</returns>
150 public int Length()
151 {
152 DoubleLinkNode node = header;
153 int count = 0;
154
155 while (node != null)
156 {
157 node = node.RLink;
158 count++;
159 }
160 return count;
161 }
162
163 }
专注于企业级软件开发,做对
客户有用的软件。