class Node():
def __init__(self, data):
self.data = data
self.next = None
class LinkList():
# 初始化头节点为空
def __init__(self):
self.head = None
# 将列表 data 初始化为链表
def initlist(self, data):
if data == []:
self.head = Node(None)
else:
self.head = Node(data[0]) # 没有头节点的单链表
p = self.head
for i in data[1:]:
node = Node(i)
p.next = node
p = p.next
# 在链表末尾添加元素(尾插法)
def add_to_tail(self, item):
p = self.head
if p == None:
p.data = item
else:
while(p.next):
p = p.next
p.next = Node(item)
p = p.next
p.next = None
# 头插法
def add_to_head(self, item):
p = self.head
if p == None:
p.data = item
else:
self.head = Node(item)
self.head.next = p
# 删除链表中所有指定值的元素
def remove(self, val):
p = self.head
if p == None:
print("链表为空")
elif p.data == val:
self.head = p.next
else:
q = p
p = p.next
while(p):
if p.data == val:
q.next = p.next
p = p.next
# break # 在这里break即可只删除第一次等于 val 的元素
else:
q = p
p = p.next
# 从尾到头打印链表(不改变链表结构)
def reverse_print(self):
p = self.head
stack = []
while(p):
stack.append(p.data)
p = p.next
return stack[::-1]
# list 的[]中有三个参数,用冒号分割:list[param1:param2:param3]
# param1:相当于stast_index,可以为空,默认为0
# param2:相当于end_index,可以为空,默认为 list.size
# param3:步长,默认为1,当步长为-1时,返回倒序原序列
# 删除链表中重复的节点,重复的节点只留一个
def deleteDuplication(self):
p = self.head
if p == None:
return
else:
q = p.next
while(p):
q = p.next
t = p
while(q):
if p.data == q.data:
t.next = q.next
q = q.next
else:
t = q
q = q.next
p = p.next
return self.head # 返回头节点
l = LinkList()
l.initlist([1,2,3,4,5])
l.add_to_tail(8)
# l.add_to_head(8)
# l.remove(4)
# print(l.reverse_print())
p = l.head
while(p):
print(p.data)
p = p.next