用python实现单链表的增删改查
#!/usr/bin/python
#coding: utf-8
class Node(object):
"数据域"
def __init__(self, data, next = 0):
self.data = data
self.next = next
class LinkList(object):
"处理类"
def __init__(self):
"head用来指向Node类变量, length用来计算单链表的长度(每插入一个元素,长度加1,如果删除的时候,长度减1)"
self.head = 0
self.length = 0
def InitList(self, data):
"单链表的初始化"
self.head = Node(data[0])
p = self.head
self.length += 1
for x in data[1:]:
node = Node(x)
# 注意下面两句话的顺序,不要弄颠倒,首先要让p指向node,然后再把它重新赋值给p,这样才完成了对p的更新
p.next = node
p = p.next
self.length += 1
def OutputList(self):
"输出单链表, 查看单链表的所有 元素"
if self.head == 0:
print(u"单链表中没有元素")
return
p = self.head
while p.next != 0:
print p.data, "->",
p = p.next
print(p.data)
def Get_Index_List(self, index):
"获取当前索引位置的元素"
if self.Is_Not_Empty() == True:
print u"单链表为空"
return False
if index < 1 or index > self.length:
print u"输入位置不合法"
return False
i = 1
p = self.head
while i < index:
p = p.next
i += 1
return p.data
def GetLength(self):
"获取单链表的长度"
return self.length
def Is_Not_Empty(self):
"判断单链表是否为空"
return self.length == 0
def DelList(self, index):
"删除指定索引的元素"
if self.Is_Not_Empty() == True:
print u"单链表为空"
return
if index < 1 or index > self.length:
print u"输入位置不合法"
return
p = self.head
if index == 1:
self.head = p.next
self.length -= 1
return
i = 1
while p.next != 0 and i < index - 1:
# 退出while循环的时候 i 的值为 index - 1
p = p.next;
i += 1
# 用r指向p的后面的元素
r = p.next
# 连接操作
p.next = r.next
self.length -= 1
def InsList(self, index, e):
"将元素e插入到索引为i的位置"
if index < 1 or index > self.length + 1:
# 可以插入的最后一个位置是长度加1
print u"插入位置不合法"
return
r = Node(e)
p = self.head
i = 1
while i < index - 1:
p = p.next
i += 1
r.next = p.next
p.next = r
p = p.next
self.length += 1
def ChaList(self, index, e):
"把index索引位置上面的元素改为e"
if self.Is_Not_Empty() == True:
print u"单链表为空"
return
if index < 1 and index > self.length:
print u"修改位置不合法"
return
p = self.head
i = 1
while i < index:
p = p.next
i += 1
p.data = e
return
def FindList(self, e):
"查找元素e出现的次数"
if self.Is_Not_Empty() == True:
return 0
p = self.head
i = 1
count = 0
while p.next != 0:
if p.data is e:
count += 1
p = p.next
i += 1
# 不要忘记最后一位也要判断
if p.data is e:
count += 1
return count
def ClearList(self, ):
"清空单链表"
self.head = 0
self.length = 0
if __name__ == "__main__":
L = LinkList()
L.InitList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
L.OutputList()
# 输出单链表的长度
print u"单链表的长度为:", L.GetLength()
# 删除
L.DelList(5)
L.OutputList()
print u"单链表的长度为:", L.GetLength()
L.DelList(0)
L.OutputList()
print u"单链表的长度为:", L.GetLength()
L.DelList(9)
L.OutputList()
print u"单链表的长度为:", L.GetLength()
# 删除
L.InsList(5, 5)
L.OutputList()
print u"单链表的长度为:", L.GetLength()
L.InsList(10, 10)
L.OutputList()
print u"单链表的长度为:", L.GetLength()
# 修改
L.ChaList(5, 10)
L.OutputList()
# 查找
t = L.Get_Index_List(5)
if type(t) != "bool":
print u"当前位置的元素为:", t
else:
print u"出错啦!!"
print u"该元素出现的次数为:", L.FindList(10)