链表(python版)

链表是数据结构中基础且重要的一环,其主要分为:

1.单项链表
2. 单项循环链表
3. 双向链表
4. 双向循环链表

单向链表

在这里插入图片描述

class ListNode():
	def __init__(self,val,next=None):
		"定义节点"
		self.val = val
		self.next = next

class SingelLinkList():
	def __init__(self):
		self.head = None

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

	def __len__(self):
		"获取链表长度"
		count = 0
		cur = self.head
		while cur!=None:# 当指针无指向便代表链表结束
			count += 1
			cur = cur.next
		return count

	def travel(self):
		"遍历链表"
		cur = self.head
		while cur!=None:
			print(cur.val,end=' ')
			cur = cur.next
		print()

	def add(self,value):
		"头部添加节点"
		node = ListNode(value)
		if self.is_empty():
			self.head = node
		else:
			node.next = self.head
			self.head = node

	def append(self,value):
		"尾部添加节点"
		node = ListNode(value)
		cur = self.head
		if self.is_empty():
			self.add(value)
			return
		else:
			while cur.next!=None:
				cur = cur.next
		cur.next = node

	def insert(self,pos,value):
		"指定位置添加节点"
		count = 1
		cur = self.head
		if self.is_empty() or pos<=1:
			self.add(value)
			return
		elif pos>=self.__len__():
			self.append(value)
			return
		node = ListNode(value)
		while count<pos-1 and count<self.__len__():
			count += 1
			cur = cur.next
		node.next = cur.next
		cur.next = node

	def remove(self,value):
		"删除指定值节点"
		cur = self.head
		if self.is_empty():
			return
		if cur.val == value:
			self.head = cur.next
			return
		while cur.next!=None:
			if cur.next.val == value:
				cur.next = cur.next.next
				break
			else:
				cur = cur.next

	def remove_pos(self,pos):
		"指定位置删除节点"
		count = 1
		cur = self.head
		if self.is_empty():
			return
		if pos<=1:
			self.head = cur.next
			return
		while count<pos-1 and count<self.__len__()-1:
			count += 1
			cur = cur.next
		if pos>=self.__len__():
			cur.next = None
		else:
			cur.next = cur.next.next

	def search(self,value):
		"查找节点"
		count = 1
		cur = self.head
		while cur!=None:
			if cur.val == value:
				print('%s位于链表中,为%d号节点'%(value,count))
				return
			else:
				count += 1
				cur = cur.next
		print('%s不存在链表'%value)

	def clear(self):
		"清空链表"
		self.head = None

单向循环链表

在这里插入图片描述

class ListNode():
	def __init__(self,val,next=None):
		self.val = val 
		self.next = next

class SingelCycleList():
	def __init__(self,node=None):
		self.head = None
		if node:#生成链表对象时,若传入一个非空节点,要使第一个节点的next指针指向自身
			node.next = node

	def is_empty(self):
		return self.head is None

	def __len__(self):
		count = 1
		cur = self.head
		if self.is_empty():
			return 0
		while cur.next!=self.head:
			count += 1
			cur = cur.next
		return  count

	def travel(self):
		cur = self.head
		if self.is_empty():
			return
		while cur.next!=self.head:
			print(cur.val,end=' ')
			cur = cur.next
		print(cur.val)

	def add(self,value):
		cur = self.head
		node = ListNode(value)
		if self.is_empty():
			self.head = node
			node.next = node
		else:
			# self.head = node
			# node.next = cur
			while cur.next!=self.head:
				cur = cur.next
			node.next = self.head
			self.head = node
			cur.next = node 

	def append(self,value):
		cur = self.head
		node = ListNode(value)
		if self.is_empty():
			self.add(value)
		else:
			while cur.next!=self.head:
				cur = cur.next
			node.next = self.head
			cur.next = node 

	def insert(self,pos,value):
		count = 1
		cur = self.head
		node = ListNode(value)
		if self.is_empty() or pos<=1:
			self.add(value)
		elif pos>=self.__len__():
			self.append(value)
		else:
			while count<pos-1 and count<self.__len__() -1:
				count += 1
				cur = cur.next
			node.next = cur.next
			cur.next = node

	def remove(self,value):
		pre = cur = self.head
		if self.is_empty():
			return
		elif cur.val == value:
			while cur.next!=self.head:
				cur =  cur.next
			self.head = pre.next
			cur.next = pre.next
		while cur.next!=self.head:
			if cur.next.val == value:
				cur.next = cur.next.next
				break
			else:
				cur = cur.next

	def remove_pos(self,pos):
		count = 1
		pre = cur = self.head
		if self.is_empty():
			return
		elif pos<=1:
			while cur.next!=self.head:

				cur =  cur.next
			self.head = pre.next
			cur.next = pre.next
			return
		else:
			while count<pos-1 and count<self.__len__()-1:
				count += 1
				cur = cur.next
			if pos>=self.__len__():
				cur.next = self.head
			else:
				cur.next = cur.next.next

	def search(self,value):
		count = 1
		cur = self.head
		if self.is_empty():
			print('%s不存在链表'%value)
			return
		while cur.next!=self.head:
			if cur.val == value:
				print('%s位于链表中,为%d号节点'%(value,count))
				return
			else:
				count += 1
				cur = cur.next
		if cur.val == value:
			print('%s位于链表中,为%d号节点'%(value,count))
		else:
			print('%s不存在链表'%value)

	def clear(self):
		self.head = None

双向链表

在这里插入图片描述

class ListNode():
	def __init__(self,val,next=None,prev=None):
		self.val = val
		self.next = next
		self.prev = prev


class DoubleLinkList():
	def __init__(self):
		self.head = None

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

	def __len__(self):
		"获取链表长度"
		count = 0
		cur = self.head
		while cur!=None:
			count += 1
			cur = cur.next
		return count

	def travel(self):
		"遍历链表"
		cur = self.head
		while cur!=None:
			print(cur.val,end=' ')
			cur = cur.next
		print()

	def add(self,value):
		"头部添加节点"
		node = ListNode(value)
		if self.is_empty():
			self.head = node
		else:
			node.next = self.head
			self.head.prev = node
			self.head = node


	def append(self,value):
		"尾部添加节点"
		node = ListNode(value)
		cur = self.head
		if self.is_empty():
			self.add(value)
		else:
			while cur.next!=None:
				cur = cur.next
			cur.next = node
			node.prev = cur

	def insert(self,pos,value):
		"指定位置添加节点"
		count = 1
		cur = self.head
		node = ListNode(value)
		if self.is_empty() or pos<=1:
			self.add(value)
		elif pos>=self.__len__():
			self.append(value)
		else:
			while count<pos and count<self.__len__():
				count += 1
				cur = cur.next
			node.next = cur
			cur.prev.next = node 
			node.prev = cur.prev
			cur.prev = node

	def remove(self,value):
		"删除指定值节点"
		cur = self.head
		if self.is_empty():return
		if cur.val == value:
			self.head = cur.next
			return
		while cur!=None:
			if cur.val == value:
				cur.prev.next = cur.next
				if cur.next:
					cur.next.prev = cur.prev
				break
			else:
				cur = cur.next

	def remove_pos(self,pos):
		"指定位置删除节点"
		count = 1
		cur = self.head
		if self.is_empty() or pos<=1:
			self.head = cur.next
			if cur.next:
				cur.next.prev = None
			return
		while count<pos and count<self.__len__():
			count += 1
			cur = cur.next
		if pos>=self.__len__():
			cur.prev.next = None
		else:
			cur.prev.next = cur.next
			cur.next.prev = cur.prev




	def search(self,value):
		"查找节点"
		count = 1
		cur = self.head
		while cur!=None:
			if cur.val == value:
				print('%s位于链表中,为%d号节点'%(value,count))
				return
			else:
				count += 1
				cur = cur.next
		print('%s不存在链表'%value)

	def clear(self):
		"清空链表"
		self.head = None


双向循环链表

在这里插入图片描述


class ListNode():
	def __init__(self,val,prev=None,next=None):
		self.val = val
		self.prev = prev
		self.next = next

class DoubleCycleList():
	def __init__(self,head=None,node=None):
		self.head = head
		if node:
			node.next = node
			node.prev = node

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

	def __len__(self):
		"获取链表长度"
		cur = self.head
		count = 1
		if self.is_empty():
			return 0
		while cur.next!=self.head:
			count += 1
			cur = cur.next
		return count

	def travel(self):
		cur = self.head
		if self.is_empty():
			return
		else:
			while cur.next!=self.head:
				print(cur.val,end=' ')
				cur = cur.next
			print(cur.val)

	def add(self,value):
		"头部添加节点"
		node = ListNode(value)
		cur = self.head
		if self.is_empty():
			self.head = node
			node.prev = node
			node.next = node
		else:
			while cur.next!=self.head:
				cur = cur.next
			node.next = self.head
			self.head.prev = node
			self.head = node
			node.prev = cur
			cur.next = node

	def append(self,value):
		"尾部添加节点"
		node = ListNode(value)
		cur = self.head
		if self.is_empty():
			self.add(value)
		else:
			while cur.next!=self.head:
				cur = cur.next
			cur.next = node
			node.prev = cur
			node.next = self.head
			self.head.prev = node

	def insert(self,pos,value):
		"指定位置插入节点"
		node = ListNode(value)
		cur = self.head
		count = 1
		if self.is_empty() or pos<=1:
			self.add(value)
			return
		elif pos>=self.__len__():
			self.append(value)
			return
		while count<pos and count<self.__len__():
			cur = cur.next
			count += 1
		node.next = cur
		cur.prev.next = node
		node.prev = cur.prev
		cur.prev = node

	def remove(self,value):
		"删除指定值节点"
		cur = self.head
		if self.is_empty():
			return
		if cur.val == value:
			while cur.next!=self.head:
				cur = cur.next
			cur.next = self.head.next
			self.head.next.prev = cur
			self.head = self.head.next
			return
		while cur.next!=self.head:
			if cur.val == value:
				cur.prev.next = cur.next
				cur.next.prev = cur.prev
				return
			else:
				cur = cur.next
		if cur.val == value:
			cur.prev.next = self.head
			self.head.prev = cur.prev

	def remove_pos(self,pos):
		"指定位置删除节点"
		count = 1
		cur = self.head
		if self.is_empty():
			return
		if self.__len__() == 1:
			self.head = None
			return
		elif pos<=1:
			while cur.next!=self.head:
				cur = cur.next
			cur.next = self.head.next
			self.head.next.prev = cur
			self.head = self.head.next
			return
		while count<pos and count<self.__len__():
			cur = cur.next
			count += 1
		if pos>=self.__len__():
			cur.prev.next = self.head
			self.head.prev = cur.prev
		else:
			cur.prev.next = cur.next
			cur.next.prev = cur.prev

	def search(self,value):
		"查找节点是否存在"
		count = 1
		cur = self.head
		if self.is_empty():
			print('%s不存在链表'%value)
			return
		while cur.next!=self.head:
			if cur.val == value:
				print('%s位于链表中,为%d号节点'%(value,count))
				return
			else:
				cur = cur.next
				count += 1
		if cur.val == value:
			print('%s位于链表中,为%d号节点'%(value,count))
		else:
			print('%s不存在链表'%value)

	def clear(self):
		self.head = None

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值