链表及Python实现

本文介绍链表的基本概念以及使用Python实现链表的基本功能,包括添加、删除、查找、更新节点等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
class Node(object):
def __init__(self, data, pnext=None):
"""
初始化
"""
self.data = data
self._next = pnext

def __repr__(self):
return str(self.data)

class ChainTable(object):
def __init__(self):
self.head = None
self.length = 0

def isEmptyp(self):
return self.length==0

def append(self, dataOrNode):
# 增加节点,将数据或者节点类型转化为节点类型
item = None
if isinstance(dataOrNode, Node):
item = dataOrNode
else:
item = Node(dataOrNode)

# 判断根节点是否为空,为空时,从根结点开始
if not self.head:
self.head = item
self.length += 1
# 根节点不为空,从根节点开始遍历,直到节点的指针为空
else:
node = self.head
while node._next:
node = node._next
node._next = item
self.length += 1

def delete(self, index):
if self.isEmptyp():
print("This chain table is empty!")
return
if index < 0 or index >= self.length:
print ("Error: out of index")
return
# 删除根节点
if index == 0:
self.head = self.head._next
self.length -= 1
return
# 保存index-1的节点,跳过第index个的节点
j = 0
node = self.head
prev = self.head
while node._next and j < index:
prev = node
node = node._next
j += 1
if j == index:
prev._next = node._next
self.length -= 1

def update(self, index, data):
if self.isEmptyp() or index < 0 or index >= self.length:
print("Error: out of index")
return
j = 0
node = self.head
while node._next and j < index:
node = node._next
j += 1
if j == index:
node.data = data

def getItem(self, index):
if self.isEmptyp() or index < 0 or index >= self.length:
print("Error: out of index")
return
j = 0
node = self.head
while node._next and j < index:
node = node._next
j += 1
return node.data

def getIndex(self, data):
if self.isEmptyp() or index < 0 or index >= self.length:
print("Error: out of index")
return
node = self.head
while node:
if node.data == data:
return j
node = node._next
j += 1
if j == self.length:
print("%s not found".format(data))
return

def insert(self, index, dataOrNode):
if self.isEmptyp():
print("This chain table is empty!")
return
if index < 0 or index >= self.length:
print ("Error: out of index")
return
# 增加节点,将数据或者节点类型转化为节点类型
item = None
if isinstance(dataOrNode, Node):
item = dataOrNode
else:
item = Node(dataOrNode)

if index == 0:
item._next = self.head
self.head = item
self.length += 1
return
j = 0
node = self.head
prev = self.head
while node._next and j < index:
prev = node
node = node._next
j += 1
if j == index:
item._next = node
prev._next = item
self.length += 1

def clear(self):
self.head = None
self.length = 0

def __repr__(self):
"""
打印链表
"""
if self.isEmptyp():
return "Empty chain table"
node = self.head
nlist = ''
while node:
nlist += str(node.data)+' '
node = node._next
return nlist
def __getitem__(self, ind):
if self.isEmptyp() or ind < 0 or ind >= self.length:
print("Error: out of index")
return
return self.getItem(ind)

def __setitem__(self, ind, val):
if self.isEmptyp() or ind < 0 or ind >= self.length:
print("Error: out of index")
return
return self.update(ind, val)

def __len__(self):
return self.length
1
2
3
4
5
chain = ChainTable()
chain.append((10,2))
chain.append(5)
len(chain)
chain[0]
(10, 2)