python 中单向链表的实现

  • 以下链表类实现的功能
    • 是否为空
    • 链表长度
    • 头部添加
    • 尾部添加
    • 根据指定位置添加
    • 根据指定值添加
    • 链表倒置
    • 链表遍历
    • 根据指定内容移除
class Node(object):
	"""定义链表的节点类,两个属性 item:内容 next:下一节点的引用地址(也可以直接理解成下一节点对象)"""

	def __init__(self, item):
		self.item = item
		self.next = None


class SingleLink(object):
	def __init__(self):
		self.__head = None

	def length(self):
		"""遍历链表得到链表长度"""
		count = 0
		cur = self.__head
		while cur:
			cur = cur.next
			count += 1
		return count

	def is_empty(self):
		"""判断链表是否为空"""
		return self.__head is None

	def travle(self):
		"""遍历链表"""
		cur = self.__head
		while cur:
			print(cur.item, end=" ")
			cur = cur.next
		print()  # 实现换行

	def add(self, item):
		"""在链表的头 向前插入节点"""
		node = Node(item)
		if self.__head is None:
			self.__head = node
		else:
			node.next = self.__head
			self.__head = node

	def append(self, item):
		"""从链表的尾部向后添加节点"""
		node = Node(item)
		if self.__head is None:
			self.__head = node
		else:
			cur = self.__head
			while cur.next:
				cur = cur.next
			cur.next = node

	def insert_by_pos(self, pos, item):
		"""pos代表在第几个节点(从0开始)之后插入节点"""
		if pos < 0:
			self.add(item)
		elif pos >= self.length():
			self.append(item)
		else:
			count = 0
			cur = self.__head
			while cur.next:
				if count == pos:
					break
				count += 1
				cur = cur.next
			node = Node(item)
			tmp = cur.next
			cur.next = node
			node.next = tmp

	def insert_by_value(self, value, item):
		"""根据链表中的节点值,在该值后插入节点,若指定value不存在,则不插入节点"""
		cur = self.__head
		while cur:
			if cur.item == value:
				node = Node(item)
				tmp = cur.next
				cur.next = node
				node.next = tmp
				break
			cur = cur.next

	def remove(self, item):
		"""根据节点值移除节点"""
		cur = self.__head
		if cur.item == item:
			"""特例:若删除是头节点"""
			tmp = cur
			self.__head = cur.next
			tmp.next = None
			return
		while cur.next:
			if cur.next.item == item:
				tmp = cur.next
				cur.next = tmp.next
				tmp.next = None
				break
			cur = cur.next

	def reverse(self):
		"""就地反序链表,永久更改"""
		"""单项链表的倒置"""
		cur = self.__head
		for i in range(self.length() - 1):
			tmp = cur.next
			self.remove(tmp.item)
			self.add(tmp.item)
			
	def reverse2(self):
		"""不使用已实现的方法,倒序"""
		tmp = self.__head.next
		self.__head.next = None
		while tmp:
			bak = tmp.next
			tmp.next = self.__head
			self.__head = tmp
			tmp = bak


if __name__ == '__main__':
	a = SingleLink()
	a.add(10)
	a.add(20)
	a.append(200)
	a.append(300)
	a.insert_by_pos(102, 500)
	a.insert_by_pos(5, 321)
	a.insert_by_value(321, 512)
	a.remove(5102)
	a.travle()
	print(a.length())
	a.reverse()
	a.travle()
	print(a.length())

  • 结果截图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值