一:带头节点,用了一个类包装
class Node:
def __init__(self, value=None, next=None):
self.data = value
self.next = next
# 链表 带头节点方便第一个元素的插入和删除
class LinkedList:
def __init__(self):
# 初始化为空表
self.head = None
# 建表
def creatList(self, n):
self.head = Node()
p = self.head
for i in range(n):
node = Node()
node.data = int(input())
p.next = node
p = p.next
p.next = None
#在第n个位置插入value
def insert(self, n, value):
p = self.head
if n > self.length():
return 0
while n and p.next:
n -= 1
p = p.next
node = Node()
node.data = value
node.next = p.next
p.next = node
# 删除第n个元素
def remove(self, n):
p = self.head
if n > self.length():
return 0
n -= 1
while n and p.next:
n -= 1
p = p.next
p.next = p.next.next
def traveList(self):
p = self.head.next
while p:
print(p.data, ' ', end='')
p = p.next
print()
# 链表逆转,有头节点可以原地逆转
def reverse(self):
tail = self.head.next
cur = tail.next
while cur:
tail.next = cur.next
cur.next = self.head.next
self.head.next = cur
cur = tail.next
# 链表判空
def isEmpty(self):
if self.head.next == None:
return True
else:
return False
# 链表长度
def length(self):
if self.isEmpty():
return 0
len = 0
p = self.head.next
while p:
len += 1
p = p.next
return len
if __name__ == '__main__':
l = LinkedList()
l.creatList(5)
l.traveList()
l.insert(5, 100)
l.traveList()
l.remove(5)
l.traveList()
二:不带头节点
class ListNode:
def __init__(self, value=None, next=None):
self.data = value
self.next = next
def creat_List(l, n):
l.data = int(input())
p = l
for i in range(n-1):
node = ListNode()
node.data = int(input())
p.next = node
p = p.next
p.next = None
def length(l):
p = l
len = 0
while p:
len += 1
p = p.next
return len
# 链表逆转
def reverse(l):
res = pre = None
p = l
while p:
pre = p.next
p.next = res
res = p
p = pre
return res
def traverse(l):
p = l
while p:
print(p.data, ' ', end='')
p = p.next
print()
if __name__ == '__main__':
l = ListNode()
creat_List(l, 5)
traverse(l)
ll = reverse(l)
traverse(ll)
traverse(l)