单向循环链表 --python描述

单向循环链表的最后一个节点会指向第一个节点

class SingleLinkList(object):
	'''单向循环链表'''
	#构造一个单向循环链表
	def __init__(self,node=None):
		self.__head = node
		#初始化时如果真传了一个节点,该节点既是第一个节点也是最后一个节点,所以它得指向自己
		if node:
			node.next = node
	
	#判空,该功能和单链表一样
	def is_empty(self):
		'''链表是否为空'''
		return self.__head == None

	def length(self):
		'''链表长度'''
		#如果是空链表,直接返回0
		if self.is_empty():
			return 0
		#不是空链表的情况
		#创建cur游标,用来遍历节点
		cur = self.__head
		#count记录数量
		count = 1
		#cur走到最后一个节点时cur.next == self.__head
		while cur.next != self.__head:	#cur一直走到cur.next == self.__head时停止
			count += 1
			cur = cur.next
		return count

	def travle(self):
		'''遍历整个链表'''
		#如果是空链表,直接返回个None
		if self.is_empty():
			return
		#如果不是空链表
		cur = self.__head
		while cur.next != self.__head	#只要不是cur.next == self.__head(最后一个节点),cur就往下走
			print(cur.elem,end=' ')
			cur = cur.next
		#cur走到最后,最后一步不会执行,也就是说最后一个节点的元素不会打印,需要手动打印
		print(cur.elem)

	def add(self,item):
		'''头插法添加元素'''
		node = Node(item)
		#如果链表是空链表
		if self.is_empty():
			self.__head = node
			#将node指向自己
			node.next = node
		#如果不是空链表
		else:
			cur = self.__head
			while cur.net != self.__head:
				cur = cur.next
			#退出循环时,cur指向尾节点
			#将新节点的next区域指向第一个节点
			node.next = self.__head
			#将self.__head指向新节点
			self.__head = node
			#将最后一个节点的next区域指向新节点
			cur.next = self.__head

	def append(self,item):
		'''链表尾部添加元素,尾插法'''
		node = Node(item):
		if self.is_empty():
			self.__head = node
			node.next = node
		else:
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			#将新节点的next区域指向头结点
			node.next = self.__head
			#将尾节点的next区域指向新节点
			cur.next = node 
	
	def insert(self,pos,item):
		'''指定位置添加元素'
		:param pos 从0开始
		''
		if pos <= 0:
			self.add(item)
		elif pos > (self.length()-1):
			self.append(item)
		else:
			pre = self.__head
			#计数,每走一步+1
			count = 0
			#当pre走到要插入节点的前面,退出循环
			while count < (pos-1):
				count += 1
				pre = cur.next
			#当走到要插入位置时
			#将新节点的next区域指向pre.next
			node = Node(item)
			node.next = pre.next
			#将pre.next指向node
			pre.next = node
	
	def search(self,item):
		'''查找节点是否存在'''
		#如果是空链表
		if self.is_empty():
			return False
		#不是空链表
		cur = self.__head
		while cur.next != self.__head:	#判断条件没包括尾节点,只到尾节点的前一个
			if cur.elem == item:
				return True
			else:
				cur = cur.next
		#退出循环时,cur正指着尾节点
		if cur.elem == item:
			return True
		return False
		
	def remove(self,item):
		'''删除节点'''
		#如果是空链表
		if self.__head ==None:
			return
			
		cur = self.__head
		pre = None
		while cur.next != self.__head:
			if cur.elem == item:
				#如果此节点是头结点
				if cur == self.__head:
					#找尾节点,新建一个游标去找
					rear = self.__head
					while rear.next != self.__head:
						rear = rear.next
					#当退出循环时rear指向尾节点
					#将头结点指向第二个节点
					self.__head = cur.next
					#将尾节点的next区域指向第二个节点
					rear.next = self.__head
				#如果是中间节点,逻辑和单链表是一样的
				else:
					pre.next = cur.next
				return	#删完后退出程序
			else:	#继续向下走
				pre = cur
				cur = cur.next
		#当退出循环时,cur才指向尾节点,需要单独判断
		if cur.elem == item:
			#当只有一个节点时,pre是空,pre.next不存在,需要单独判断
			if pre == None:
				#将self.__head指向空
				self.__head == None
			else:
				#将pre.next指向第一个节点cur.next
				pre.next = cur.next		
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值