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
}
/// <summary>2
/// 双链表的节点3
/// </summary>4
public class DoubleLinkNode5
{6
private object _data;//存储数据7
private DoubleLinkNode _rLink; //存储右表的指针8
private DoubleLinkNode _lLink; //存储左边的指针9

10
public object Data11
{12
get { return _data; }13
set { _data = value; }14
}15

16

17
public DoubleLinkNode LLink18
{19
get { return _lLink; }20
set { _lLink = value; }21
}22

23
public DoubleLinkNode RLink24
{25
get { return _rLink; }26
set { _rLink = value; }27
}28

29

46
}47

48

49
/// <summary>50
/// 双链表51
/// </summary>52
public class DoubleLinkList53
{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
else107
{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
}专注于企业级软件开发,做对
客户有用的软件。

浙公网安备 33010602011771号