Python之链表

Python-链表-浅谈结构脉络:非顺序存储结构,由一系列节点组成每个节点由数据域与指针域构成数据域存储数据元素,指针域存储下一节点指针分单链表,双链表,循环链表(循环链表亦分单循环与双循环)python实现1.定义节点数据元素:item指针:nextclass Node(object):'''单链表''' def __init__(self,item): self.item = item self.next = None2.定义链表head:首地址指针class
摘要由CSDN通过智能技术生成

Python-链表-浅谈

结构脉络:
非顺序存储结构,由一系列节点组成
每个节点由数据域与指针域构成
数据域存储数据元素,指针域存储下一节点指针
分单链表,双链表,循环链表

(循环链表亦分单循环与双循环)

在这里插入图片描述
python实现
1.定义节点
数据元素:item
指针:next

class Node(object):
'''单链表'''
	def __init__(self,item):
		self.item = item
		self.next = None

2.定义链表
head:首地址指针

class SingleLinkList(object):
'''单链表'''
	def __init__(self):
		self._head = None
if __name__ == '__main__':
	link_list = SingleLinkList()
	node1 = Node(1)
	node2 = Node(2)
	link_list._head = node1
	node1.next = node2

	print(link_list._head.item)
	print(link_list._head.next.item)

其实python有内置分装好的链表数据结构及其方法,不必每次用时自己定义,这样展示近是为了告诉我们,无论是python 还是C++/Java,都仅是语言,机器不明白什么是链表,也不明白什么是算法,仅知道按步执行而已,数据结构与算法是人们想出来的一种计算方法,而语言只是按照人们预设好的逻辑去描述那些方法,初学者不要被困在语言上,想清楚自己要做什么,弄清楚那些前辈们总结好的数据结构,将自己要做的事用某种语言描述出来,描述清楚,当机器明白它需要做什么时,我们的目的便达到了

链表中的操作方法
(单链表)

is_empty() #链表是否为空
length() #链表长度
items() #获取链表数据迭代器
add(item) #链表头部添加元素
append(item) #链表尾部添加元素
insert(pos,item) #指定位置添加元素
remove(item) #删除节点
find(item) #查找节点是否存在

具体实现代码(实际使用中可直接调用上述方法)

class SingleLinkList(object):
	def __init__(self):
		self._head = None
	
	def is_empty(self):
		return self._head is None

	def length(self):
		cur = self._head
		count = 0
		while cur is not None:
			count += 1
			cur = cur.next
		return count

	def items(self):
		'''遍历链表'''
		cur = self._head
		while cur is not None:
			yield cur.item
			cur = cur.next

	def add(self, item):
		node = Node(item)
		node.next = self._head
		self._head = node
		'''
		链表的添加和换女朋友一样
		newnode先处理后面,再连接前面
		'''
	def append(self, item):
		node = Node(item)
		if self.is_empty():
			self._head = node
		else:
			cur = self._head
			while cur.next is not None:
				cur = cur.next
			cur.next = node
		cur.next = node
		# 这一段是在找最后一个节点,单链表就这一点不好,找哪个都要从头遍历

	def insert(self, index, item):
		if index <= 0:
			self.add(item)
		elif index > (self.length() - 1):
			self.append(item)
		else:
			node = Node(item)
			cur = self._head
			for i in range(index -1):
				cur = cur.next
			node.next = cur.next
			cur.next = node
	#先考虑特殊情况,再处理普通情况

	def remove(self, item):
		cur = self._head
		pre = None
		while cur is not None:
			if cur.item == item:
				if not None:
					self._head = cur.next
				else:
					pre.next = cur.next	
				return True
			else:
				pre = cur
				cur = cur.next

	def find(self, item):
		return item in self.items()
	# 返回True or False 
			

操作链表:

if __name__ == '__main__':
	link_list = SingleLinkList()
	for i in range(5):
		link_list.append(i)
	link_list.add(6)
	for i in link_list.items():
		print(i, end='\t')
		link_list.insert(3, 9)
		print('\n', list(link_list.items()))
		link_list.remove(0)
		print(link_list.find(4))

#自己运行试试看,看看输出的与自己推算的是否一致

循环链表与上面的单链表逻辑一致,只是要多考虑最后一个元素节点的next指向head节点

双链表的定义,Node 类里增加一个

self.prev = None

其余实现逻辑也是由单链表衍生出来的,调用的方法名都是一样的,只是方法内部的实现上有些许差异,实际应用中只需要会调用即可,但是若能仿照上面单链表把其他实现细节自己写一遍会更好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值