python算法:02 基础数据结构 单链表

介绍

  • 链表有一个个结点Node连接而成每个结点都包含数据域(Data)和指针域(Next),适合插入和删除频繁的结构。
头结点:指向链表的第一个结点
尾结点:指向链表的最后一个结点
None:链表最后一个结点的指针域,为空
  • 单链表:每个结点的指针域指向下一个结点,链表无环
  • 双向链表:每个结点有两个指针域,分别指向前一个和后一个结点
  • 单项循环链表:链表的尾指针域指向头结点,链表有环,遍历不会出现None

以单链表为例实现链表的各种操作

Node.py

# 定义一个结点类
class Node:
	def __init__(self,data=''):
		self.data = data
		self.next = None
		return 

	def has_value(self, value):
		if self.data == value:
			return True
		else:
			False

linkList.py

# 定义一个链表类
from Node import Node
class linkList:
	def __init__(self):
		"""
		初始化方法
		:param head: 头结点
		:param tail: 尾结点
		:param length: 链表长度
		:return
		"""
		self.head = None
		self.tail = None
		self.length = 0
		return 

	def is_empty(self):
		"""
		判断链表是否为空
		"""
		if self.length != None:
			print('链表长度为:{}'.format(self.length))
			return True
		else:
			print('链表为空')
			return False

	def add_node(self, item):
		"""
		在表尾添加节点
		:param item: 要插入的节点
		:return :
		"""

		# 判断item是否为Node类型
		if not isinstance(item, Node):
			item =Node(item)

		if self.head is None:
			# 链表为空则头插
			self.head = item
		else:
			#链表不为空则尾插
			node = self.head
			while node.next != None:
				node = node.next 	# 找到链尾

			if node.next == None:
				self.tail = node
				self.tail.next = item
				item = self.tail
		self.length += 1
		return

	def insert_node(self, index, data):
		"""
		添加节点
		:param index: 位置
		:param data: 值
		:return :
		"""
		if self.is_empty() == False:
			print("这是一个空链表")
			return
		index = int(index)
		if index < 0 or index >= self.length:
			print("插入位置有误")
			return

		item = Node(data)
		int(index)
		# 在表头插入
		if index == 1:
			item.next = self.head
			self.head = item
			self.length += 1
			return

		j=0
		node = self.head
		prev = self.head
		# 找到索引位置的结点
		while node.next and j < index:
			prev = node
			node = node.next
			j += 1
		# 插入结点
		if j == index:
			item.next = node
			prev.next = item
			self.length += 1

	def delete_node_byid(self, item_id):
		"""
		通过索引删除结点:将待删除结点 的前一个结点的 next域指向待删除结点next(断链衔接)
		:param item_id: 待删除结点索引
		:return :
		"""
		id = 1		
		current_node = self.head		# 将头结点设置为当前结点,即从头结点开始找
		previous_node = None			# 头结点的前一个结点为空
		# print(type)
		while current_node is not None:
			print(f"{current_node.data} , {current_node.next}")
			if id == int(item_id):
				if previous_node is not None:
					previous_node.next = current_node.next    # 断链衔接
				else:
					self.head = current_node.next   # 删除头结点
					return

			# 没找到就继续找
			previous_node = current_node
			current_node = current_node.next
			id = id + 1
		self.length -= 1

		return

	def find_node(self, value):
		"""
		通过数值寻找结点
		:param value: 值
		:return : 查找到的结点
		"""
		current_node = self.head
		node_id = 1
		results = []
		while current_node is not None:
			if current_node.has_value(value):
				results.append(node_id)
			current_node = current_node.next
			node_id = node_id + 1
		print("该元素索引为{}".format(results))

	def print_link(self):
		"""
		遍历输出
		"""
		
		current_node = self.head
		print("当前链表为:")
		while current_node is not None:
			print(current_node.data)
			current_node = current_node.next
		return

userInterface.py
python中没有switch-case 文档指示使用if-elif实现

# 简单的做一个操作引导
from Node import Node
from linkList import linkList

def user_choice():
	key = input("\n请选择要执行的操作:1.新建单链表 2.插入结点 3.通过位置删除结点  4.通过数值查找结点 5.遍历输出\n")
	return key

def user(key, linklist):

	if key == '1':
		i = 1
		massage = ""
		while True:
			massage = input('\n请输入第{}个要存储的信息(输入\\q返回,exit退出):\t '.format(i))
			if massage == '\\q':
				break
			else:
				node = Node(massage)
				linklist.add_node(node)
				i += 1
	elif key == '2':
		index = input('请输入要插入的位置索引(输入q返回,exit退出):')
		value = input('请输入要插入的值:')
		linklist.insert_node(index, value)
	elif key == '3':
		index = input('请选择要删除的位置索引(输入q返回,exit退出):')
		linklist.delete_node_byid(index)
	elif key == '4':
		value = input('请选择要查找的值(输入q返回,exit退出):')
		linklist.find_node(value)
	elif key == '5':
		linklist.print_link()

run.py

# 程序启动入口
from userInterface import * 

if __name__ == '__main__':
	massage = ''
	linklist = linkList()
	while massage != 'exit':
		key = user_choice()
		user(key,  linklist)
		massage = key
	print('Bye')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值