# coding=utf-8
import random
random.seed(1)
# 创建单链表节点
class ListNode():
def __init__(self, x, next=None):
# data表示链表的数据域,next表示链表的指针域
self.data = x
self.next = next
class ListNode_op():
# 创建无头节点单链表
# 种子设置为1则传入的各个节点的值为[17, 72, 97, 8, 32, 15, 63, 97, 57,60]
def create(self, length, values=None):
head_node = ListNode(None)
res = head_node
for i in range(length):
# 假设随机产生0-100整数作为链表节点的值
if values == None:
x = random.randint(0, 100)
else:
x = values[i]
head_node.next = ListNode(x)
head_node = head_node.next
return res.next
def print_linkedNode(self, node):
node_list = []
while node:
# print("node address", node, "value", node.data, "next", node.next)
# print(node.data)
node_list.append(node.data)
node = node.next
print(node_list)
# 获取链表长度
def get_len(self, linked_list):
length = 0
while linked_list:
linked_list = linked_list.next
length += 1
return length
# 在末尾增加节点
def add(self, linked_list, node):
res = linked_list
while linked_list.next != None:
linked_list = linked_list.next
linked_list.next = node
return res
# 在第n号位置插入新的节点
def insert(self, linked_list, node, n):
# res都是指向linked_list第一个节点的指针
res = linked_list
i = 1
while i < n:
i += 1
if linked_list.next != None:
linked_list = linked_list.next
else:
print("越界")
return
node.next = linked_list.next
linked_list.next = node
return res
# 在倒数第n号位置增加node
# 两种思路:1、可以先求出震哥哥链表的长度,然后求len - n就是需要插入的的位置
# 2、两个指针都指向开始,第一个指针移动到第n个位置后,第二个指针一起移动,
# 直到第一个指针停止,第二个指针所指的位置就是需要插入节点的位置
def inset_reversed(self, linked_list, node, n, case=1):
if case == 1:
length = self.get_len(linked_list)
insert_ind = length - n + 1
res = self.insert(linked_list, node, insert_ind)
return res
else:
res = linked_list
p1 = p2 = linked_list
i = 1
while p1.next != None:
i += 1
p1 = p1.next
if i > n:
p2 = p2.next
node.next = p2.next
p2.next = node
return res
# 删除第n个节点(n从1开始)
def delete(self, linked_list, n):
i = 1
res = linked_list
while i < n - 1:
i += 1
linked_list = linked_list.next
linked_list.next = linked_list.next.next
return res
# 修改第n个节点的值为value
def modify(self, linked_list, n, value):
res = linked_list
for i in range(n-1):
linked_list = linked_list.next
linked_list.data = value
return res
# 查找第n号元素
def search(self, linked_list, n):
for i in range(n-1):
linked_list = linked_list.next
data = linked_list.data
return data
# 链表反向
def reversed(self, linked_list):
last = None
while linked_list:
tmp = linked_list.next
linked_list.next = last
last = linked_list
linked_list = tmp
return last
if __name__ == "__main__":
ln = ListNode_op()
# 创建长度为10的链表
linked_list = ln.create(10)
ln.print_linkedNode(linked_list) # [17, 72, 97, 8, 32, 15, 63, 97, 57, 60]
# 获取链表的长度
length = ln.get_len(linked_list)
# 增加一个88的节点
node1 = ListNode(88)
linked_list = ln.add(linked_list, node1) # [17, 72, 97, 8, 32, 15, 63, 97, 57, 60, 88]
ln.print_linkedNode(linked_list)
# 在第5号位置插入新的节点66
node2 = ListNode(66)
linked_list = ln.insert(linked_list, node2, 10) # [17, 72, 97, 8, 32, 15, 63, 97, 57, 60, 66, 88]
ln.print_linkedNode(linked_list)
# 倒数第n个位置插入节点
node3 = ListNode(11)
linked_list = ln.inset_reversed(linked_list, node3, 4, case=1) # [17, 72, 97, 8, 32, 15, 63, 97, 57, 11, 60, 66, 88]
ln.print_linkedNode(linked_list)
# 删除第3个节点
linked_list = ln.delete(linked_list, 3) # [17, 72, 8, 32, 15, 63, 97, 57, 11, 60, 66, 88]
ln.print_linkedNode(linked_list)
# 修改第7个节点的值为100
linked_list = ln.modify(linked_list, 7, 100) # [17, 72, 8, 32, 15, 63, 100, 57, 11, 60, 66, 88]
ln.print_linkedNode(linked_list)
# 查找第2个元素
value = ln.search(linked_list, 2) # 72
print(value)
# 链表反向
reserved_linked_list = ln.reversed(linked_list) # [88, 66, 60, 11, 57, 100, 63, 15, 32, 8, 72, 17]
ln.print_linkedNode(reserved_linked_list)
"""
结果:
[17, 72, 97, 8, 32, 15, 63, 97, 57, 60]
[17, 72, 97, 8, 32, 15, 63, 97, 57, 60, 88]
[17, 72, 97, 8, 32, 15, 63, 97, 57, 60, 66, 88]
[17, 72, 97, 8, 32, 15, 63, 97, 57, 11, 60, 66, 88]
[17, 72, 8, 32, 15, 63, 97, 57, 11, 60, 66, 88]
[17, 72, 8, 32, 15, 63, 100, 57, 11, 60, 66, 88]
72
[88, 66, 60, 11, 57, 100, 63, 15, 32, 8, 72, 17]
"""
数据结构(Python)-单链表实现
最新推荐文章于 2024-05-25 13:42:25 发布