数据结构与算法 python实现链式结构,单链表

数据结构与算法

二,链式结构
特点:内存不连续 下标无法访问 append容易 遍历难(必须从左边开始遍历,一个一个的遍历)
1.单链表:有一个root节点,是链表的入口,单链表有两个值分别为value,next , next用于指向下一个节点
数据属性:root,length
方法:init,append,appendleft,iter_node,remover,find,popleft,clear
操作的时间复杂度:
append O(1)
appendleft O(1)
find O(n)
remover O(n)

用python实现一个单链表 linkes
#Node节点用于定义每一个元素
class Node(object):
	def __init__(self,value = None,next = None):
		self.value , self.next = value,next

#实现方法
class linkes(object):
	#首先给他一个最大的长度,None是可以无限扩充的
	def __init__(self,maxsize = None):
		self.maxsize = maxsize
		#根节点,进入Node的节点
		self.root = Node()
		#长度默认为零
		self.length = 0
		#添加一个next用于记录最后一个节点
		self.tailnode = None
	def __len__(self):
		return self.length
	#从右边插入一个值
	def append(self,value):
		#判断是否超出了链表的最大长度
		if self.maxsize is not None and len(self) > self.maxsize:
			#如果超出了就返回一个异常
			raise Exception('Full')
		#构造一个新的节点 赋值为value
		node = Node(value)
		#取到最后一个节点的next
		tailnode = self.tailnode
		#判断这个节点是不是None
		if tailnode is Node:
			#如果是就把root的节点指向当前节点
			self.root.next = node
			#如果不是
		else:
			#就把最后一个节点指向前一个节点
			tailnode.next  = next
		#更新最后一个节点
		self.tailnode = node
		#长度加一
		self.lenght += 1
	#往左边插入节点
	def appendleft(self,value):
		#先定义一个头节点
		headnode = self.root.next
		#新建一个节点
		node = Node(value)
		#当前的下一个节点指向头节点
		node.next = headnode
		#长度加一
		self.length += 1
	#遍历操作
	def iter_node(self):
		#从根节点的下一个节点开始遍历
		curnode = self.root.next
		#只要这个节点不是尾节点
		while curnode is not self.tailnode:
			#生成当前节点
			yield curnode
			#更新节点
			curnode = curnode.next
		#生成最后一个节点
		yield curnode
	#遍历操作
	def __iter__(self):
		#只要node在iter_node中生就取出他的value
		for node in self.iter_node():
			yield node.value
	#删除
		def remove(self,value):
			#根节点
			prevnode: Node = self.root
			#当前的节点,从首节点开始
			curnode = self.root.next
			#遍历
			for curnode in self.iter_node():
				#如果参数==value
				if curnode.value == value:
					#把上一个节点的尾元素指向下一个元素
					prevnode.next = curnode.next
					if curnode is self.tailnode:
						self.tailnode = prevnode
						#删除当前节点
					del curnode
					#长度减一
					self.length -= 1
					return 1
	#查找
	def find (self,value):
		#链表中的第几个元素
		index = 0
		#
		for node in self.iter_node():
			#如果他的值等于参数value
			if node.value == value:
				#返回这个index
				return index
			#否则index递增
			index +=1
		return -1
	#弹出第一个节点
	def popleft(self):
		#如果root.next为空就报一个异常
		if self.root.next is Node:
			raise Exception('pop from empty LinkedList')
		#头节点
		headnode = self.root.next
		#把root的节点的下一个节点
		self.root.next = headnode.next
		#长度减一
		self.length -= 1 
		value = headnode.next
		#删除头节点
		del headnode
		#返回value值
		return value
	#清空链表
		for node in self.iter_node():
			del node
		self.root.next = None
		self.lenght = 0

你可能感兴趣的:(python)