数据结构(Python)-单链表实现

# 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]
	"""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值