单链表 --python描述

#创建节点类
#一个节点需要两个内容:数据elem和下一个节点的地址
class Node(object):
	'''节点类'''
	def __init__(self,elem):
		#数据区
		self.elem = elem
		#指针区
		self.next = None

#创建单链表类
#需要创建节点,需要有操作单链表(实例)的方法
class SingleLinkList(object):
	'''单链表'''
	def __init__(self,node=None):	#将节点传进来(使用默认参数,用户也可以不传,不传时相当于初始化一个空链表)
		#头结点的指针self.__head,指向第一个节点,只要有头结点指针,就能找到后面的节点
		#头节点不需要让外人使用(私有属性),且一开始可指向None
		self.__head = node	
	
	def is_empty(self):
		'''判断链表是否为空'''
		#只要链表的头节点指向空,就是空链表
		return self.__head == None
		
	def length(self):
		'''链表长度'''
		#链表长度=节点的数量
		#找一个第三方指针,记录当前访问到的位置
		cur = self.__head	#第一步:让cur游标和头节点指针一样,指头结点
		#第二步:cur指针,用来遍历移动遍历节点
		count = 0	#计数,count就代表链表长度
		while cur != None:	#当指针指向的下一个为None时,表示遍历到了最后,循环结束
			count += 1
			cur = cur.next
		return count

	def travle(self):
		'''遍历整个链表'''
		cur = self.__head
		while cur != None:
			print(cur.elem,end=' ')	#打印出元素值,以空格连接
		print(' ')	#每次遍历后打个空格换行,因为Print()默认为换行
		
	def add(self,item):	#时间复杂度为 O(1)
		'''链表头部添加元素,头插法'''
		#先让新节点指向第一个节点,再让投节点指向新节点,这样就连起来了
		#创建新节点
		node = Node(item)
		#让新节点的地址部分(next)指向原来的第一个节点的数据部分
		node.next = self.__head
		#将投节点指向新节点的数据部分
		self.__head = node
		
	def append(self,item):	#item表示用户输入的数据,时间复杂度为O(n)
		'''链表尾部添加元素,尾插法'''
		#构造节点,在一个类的内部 实例化另一个类的对象
		node = Node(item)
		#如果向空链表中append,直接将投节点指向新节点
		if self.is_empty():
			self.__head = node
		else:
			cur = self.__head	#让cur和头节点一样,指向第一个节点
			while cur.next != None:	#开始走路,一直走到最后
				cur = cur.next
			#当走到最后时,指向新的节点,就append了
			cur.next = node
			
	def insert(self,pos,item):	#时间复杂度为O(n)
		'''指定位置添加元素
		:param pos 从0开始
		'''
		#如果用户输入的pos<=0,是头插法
		if pos <= 0:
			self.add(item)
		#如果用户输入的pos>链表索引的最大值,认为是尾插法
		elif pos > (self.length()-1):
			self.append(item)
		else:
			#需要先改变新节点的指向,再改变原链表中节点的指向,以保证原有节点的连续性以免数据丢失
			#需要有一个新的游标pre,指向要插入节点位置pos的前一个节点,以方便使用pre.next
			pre = self.__head
			count = 0
			while count < (pos-1):	#当移动到Pos前一个位置时停下来
				count += 1
				pre = pre.next
			#当循环退出后,pre指向pos-1位置
			#将新节点的地址区域指向要插入节点的值区域
			node = Node(item)
			node.next = pre.next
			#将要插入位置节点的前一个节点的地址区域指向新节点的值区域
			pre.next = node
		
	def remove(self,item):	#时间复杂度为O(n)
		'''删除节点'''
		#cur遍历找item,找到后将cur前一个节点的next(pre.next)指向后一个节点的elem(就是cur.next),给两个游标
		cur = self.__head	#先将cur指向第一个节点,pre指向none
		pre = None
		while cur != None
			#如果cur指向的值等于item,则将pre.next指向cur.next
   			if cur.elem = item:
   				#先判断此节点是否是头节点或者是否自由一个节点
   				#如果是头节点或只有一个节点,self.__head指向cur.next
   				if cur == self.__head:
   					self.__head == cur.next
   				else:
	    				pre.next = cur.next
	    			break	#删完就退出循环
    			#如果不是,就将pre和cur向后移继续查找
 			else:
				pre = cur	#pre向后移一步,指向现在cur指向的位置
				cur = cur.next #cur再向后移动一步


	def search(self,item):
		'''查找节点是否存在,遍历链表,存在则返回True'''
		cur = self.__head
		#指针一边向后移,一边比较值是否相等
		while cur != None:
			if cur.elem == item:
				return True
			else:
				cur = cur.next

		#整个循环都没找到,返回False
		return False


if __name__ == '__main__':
	ll = SingleLinkList()
	print(ll.is_empty())
	print(ll.length())

	ll.append(1)
	print(ll.is_empty())
	print(ll.length())
	
	ll.add(8)
	ll.insert(-1,8)
	ll.trval() #遍历打印
	ll.insert(1,9)
	ll.trval() #遍历打印
	ll.insert(10,5)
	ll.trval()	#遍历打印
	ll.remove(100)	#删除
	ll.travel()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值