最近在看数据结构,书籍中是用C语言实现的单链表。尝试用python实现了一个单链表,包括单链表的创建、读取、插入和删除等基本操作。
# /usr/bin/python
# -*- coding: utf-8 -*-
# Function: simulate the link-list in python 3
# __author__: wangmin
# 创建结点类
class ListNode(object):
def __init__(self, data):
self.data = data
self.next = None
# 创建链表类
class CreatList(object):
def __init__(self):
self.head = ListNode(None)
# 链表初始化函数
def InitList(self, data):
# 创建头结点
self.head = ListNode(data[0])
p = self.head
for i in data[1:]:
node = ListNode(i)
p.next = node
p = p.next
# 链表判空
def IsEmpty(self):
p = self.head
if p.next == None:
print("Empty List!")
return 1
else:
return 0
# 计算链表长度
def GetLength(self):
if self.IsEmpty():
return 0
p = self.head
count = 0
while p:
count += 1
p = p.next
return count
# 遍历链表,输出链表的每个结点值,用“,”隔开
def ReadList(self):
if self.IsEmpty():
return 0
p = self.head
while p:
print(p.data,end = ',')
p = p.next
print('')
# 获取链表第i个结点数据
def GetList(self, i):
if i > self.GetLength():
print("第%d个元素不存在", i)
return 0
p = self.head
index = 1
while index < i:
p = p.next
index += 1
print("第%d个数据为:%d" % (i, p.data))
# 链表插入数据,在第i个结点后插入数据data
def InsertList(self, i, data):
if i > self.GetLength():
print("插入失败!")
exit(0)
p = self.head
index = 1
while index < i:
p = p.next
index += 1
node = ListNode(data)
node.next = p.next
p.next = node
# 链表删除函数,删除第i个结点
def DeleteList(self, i):
if i > self.GetLength():
print("删除失败!")
exit(0)
index = 1
p = self.head
while index < i:
pre = p
index += 1
p = p.next
pre.next = p.next
p = None
# 链表逆序
def reverse(self):
p = self.head
q = None
while p:
temp = p.next
p.next = q
q = p
p = temp
self.head = q
测试
1 创建链表
# 创建链表类
list = CreatList()
list.ReadList()
输出:
Empty List!
2 初始化链表
# 链表数据
data = [1, 2, 1, 8, 3, 9]
list.InitList(data)
list.ReadList()
print(list.GetLength())
输出:
1,2,1,8,3,9,
6
3 读取链表结点值
# 读取链表的第4个结点值
list.GetList(4)
输出:
第4个数据为:8
4 插入结点
# 在第i个结点后插入一个结点
list.InsertList(3, 666)
list.ReadList()
输出:
1,2,1,666,8,3,9,
5 删除结点
# 删除第i个结点
list.DeleteList(3)
list.ReadList()
输出:
1,2,666,8,3,9,
6 反转链表
# 反转链表
list.reverse()
list.ReadList()
输出:
9,3,8,666,2,1,