双向链表和单向循环链表

一.双向链表的操作

1.双向链表的具体阐述

双向链表 : 双向链表即表示链表的节点拥有两个方向,链表节点不仅有后继指针next指向下一个节点,而且还有前驱节点prev指向对应的前一个节点,从而形成两节点之间的相互指向,故这样的链表就成为双向链表

双向链表数据结构图如下:
在这里插入图片描述

双链表单个节点的数据结构如下:
在这里插入图片描述

2.双向链表以及链表节点的创建

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node


'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

3.在双向链表类的内部定义一个方法来判断双向链表是否为空链表,若为空则返回True,否则返回False

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双链表是否为空'''
	def is_empty(self):
		return self.__head == None



'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

'''判断双链表是否为空链表'''
print(link.is_empty())
print(dou_link.is_empty())

输出结果:

True
False

4.在双向链表类中定义一个方法检查链表的长度

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双向链表是否为空'''
	def is_empty(self):
		return self.__head == None    
		                              
	'''定义一个方法检查双向链表的长度'''                        			          
	def length(self):
		cur = self.__head
		count = 0
		while cur != None:
			count += 1
			cur = cur.next
		return count           #返回count的值即为双链表的长度
		

	
'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

'''检查双链表的长度'''
print(link.length())              #空双链表的长度为0
print(dou_link.length())          #拥有一个节点的双链表的长度为1

输出结果:

0
1

5.定义一个方法来遍历双链表的元素

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双向链表是否为空'''
	def is_empty(self):
		return self.__head == None    
		                              
	'''定义一个方法检查双向链表的长度'''                        			          
	def length(self):
		cur = self.__head
		count = 0
		while cur != None:
			count += 1
			cur = cur.next
		return count           #返回count的值即为双链表的长度
		
	'''定义一个方法遍历双向链表'''
	def traversal(self):
		cur = self.__head
		while cur != None:
			print(cur.item)         #输出双向链表中的每个元素
			cur = cur.next
			
			
	
'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

'''遍历双向链表'''
link.traversal()            #若为空链表则遍历后不会有任何结果输出

dou_link.traversal()        #若为非空链表则遍历会显示对应元素值

输出结果:

20

6.定义一个方法向双向链表的尾部添加元素

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双向链表是否为空'''
	def is_empty(self):
		return self.__head == None    
		                              
	'''定义一个方法检查双向链表的长度'''                        			          
	def length(self):
		cur = self.__head
		count = 0
		while cur != None:
			count += 1
			cur = cur.next
		return count           #返回count的值即为双链表的长度
		
	'''定义一个方法遍历双向链表'''
	def traversal(self):
		cur = self.__head
		while cur != None:
			print(cur.item)         #输出双向链表中的每个元素
			cur = cur.next
	
	'''定义一个方法向双向链表的尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		cur = self.__head
		if cur:
			while cur.next != None:
				cur = cur.next
			cur.next = node
			node.prev = cur
		else:
			self.__head = node
					
			
	
'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

'''双向链表尾部添加元素'''
link.append(100)         #链表尾部添加元素100
link.append(110)		 #链表尾部添加元素110	
link.traversal()         #遍历链表
dou_link.append('a')     #链表尾部添加元素'a'
dou_link.append('ll')    #链表尾部添加元素'11'
dou_link.append('amy')   #链表尾部添加元素'amy'
dou_link.traversal()     #遍历链表


输出结果:

100
110
20
a
11
amy

7.在双向链表类内部定义一个方法用于在双链表的头部添加元素

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双向链表是否为空'''
	def is_empty(self):
		return self.__head == None    
		                              
	'''定义一个方法检查双向链表的长度'''                        			          
	def length(self):
		cur = self.__head
		count = 0
		while cur != None:
			count += 1
			cur = cur.next
		return count           #返回count的值即为双链表的长度
		
	'''定义一个方法遍历双向链表'''
	def traversal(self):
		cur = self.__head
		while cur != None:
			print(cur.item)         #输出双向链表中的每个元素
			cur = cur.next
	
	'''定义一个方法向双向链表的尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		cur = self.__head
		if cur:
			while cur.next != None:
				cur = cur.next
			cur.next = node
			node.prev = cur
		else:
			self.__head = node
	'''定义一个方法向双向链表的头部添加元素'''


	def add(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		if self.is_empty():        
			self.__head = node       #当为空链表时
		else:                        #当双链表非空时
			self.__head.prev = node    
			node.next = self.__head
			self.__head = node
		
					
			
	
'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

'''向双向链表的头部添加元素'''
link.add(10)
link.add(20)
link.traversal()

dou_link.add('aa')
dou_link.add('bb')
dou_link.traversal()

输出结果:

20
10
bb
aa
20

8.类中定义一个方法用于在双向链表的对应位置插入元素

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双向链表是否为空'''
	def is_empty(self):
		return self.__head == None    
		                              
	'''定义一个方法检查双向链表的长度'''                        			          
	def length(self):
		cur = self.__head
		count = 0
		while cur != None:
			count += 1
			cur = cur.next
		return count           #返回count的值即为双链表的长度
		
	'''定义一个方法遍历双向链表'''
	def traversal(self):
		cur = self.__head
		while cur != None:
			print(cur.item)         #输出双向链表中的每个元素
			cur = cur.next
	
	'''定义一个方法向双向链表的尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		cur = self.__head
		if cur:
			while cur.next != None:
				cur = cur.next
			cur.next = node
			node.prev = cur
		else:
			self.__head = node


	'''定义一个方法向双向链表的头部添加元素'''
	def add(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		if self.is_empty():        
			self.__head = node       #当为空链表时
		else:                        #当双链表非空时
			self.__head.prev = node    
			node.next = self.__head
			self.__head = node

	'''定义一个方法用于在双向链表的指定位置插入元素'''
	def insert(self,pos,item):
		'''指定位置插入元素'''
		if pos <= 0:
			self.add(item)
		elif pos > (self.length()-1):
			self.append(item)
		else:
			node = Node(item)
			count = 0
			cur = self.__head
			while count < pos:
				count += 1
				cur = cur.next
			node.next = cur
			cur.prev.next = node
			node.prev = cur.prev
			cur.prev = node		
					
			
	
'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)



'''在双向链表指定位置添加元素'''
link.insert(0,1)
link.insert(0,'a')
link.insert(1,'second')
link.insert(0,33)
link.insert(4,66)
link.insert(10,0000)
link.traversal()

输出结果:

33
a
second
1
66
0

9.类中定义一个方法搜索指定元素是否存在

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双向链表是否为空'''
	def is_empty(self):
		return self.__head == None    
		                              
	'''定义一个方法检查双向链表的长度'''                        			          
	def length(self):
		cur = self.__head
		count = 0
		while cur != None:
			count += 1
			cur = cur.next
		return count           #返回count的值即为双链表的长度
		
	'''定义一个方法遍历双向链表'''
	def traversal(self):
		cur = self.__head
		while cur != None:
			print(cur.item)         #输出双向链表中的每个元素
			cur = cur.next
	
	'''定义一个方法向双向链表的尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		cur = self.__head
		if cur:
			while cur.next != None:
				cur = cur.next
			cur.next = node
			node.prev = cur
		else:
			self.__head = node


	'''定义一个方法向双向链表的头部添加元素'''
	def add(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		if self.is_empty():        
			self.__head = node       #当为空链表时
		else:                        #当双链表非空时
			self.__head.prev = node    
			node.next = self.__head
			self.__head = node

	'''定义一个方法用于在双向链表的指定位置插入元素'''
	def insert(self,pos,item):
		'''指定位置插入元素'''
		if pos <= 0:
			self.add(item)
		elif pos > (self.length()-1):
			self.append(item)
		else:
			node = Node(item)
			count = 0
			cur = self.__head
			while count < pos:
				count += 1
				cur = cur.next
			node.next = cur
			cur.prev.next = node
			node.prev = cur.prev
			cur.prev = node	

	'''定义一个方法用于搜索指定元素'''
	def search(self,item):
		cur = self.__head
		while cur != None:
			if cur.item == item:
				return True
			else:
				cur = cur.next
		return False	
	
					
			
	
'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

'''搜索元素是否在双向链表中'''
print(link.search(10))
print(dou_link.search(20))
print(dou_link.search(30))


输出结果:

False
True
False

10.删除双向链表中指定的元素

'''双向链表节点模板的创建'''
class Node(object):
	def __init__(self,item):
		self.item = item
		'''单个节点的后继指针初始值设为None'''
		self.next = None 
		'''单个节点的前驱指针初始值设为None'''     
		self.prev = None

'''双向链表模板的创建'''
class DoubleLink(object):
	def __init__(self,node = None):
		self.__head = node
	
	'''定义一个方法判断双向链表是否为空'''
	def is_empty(self):
		return self.__head == None    
		                              
	'''定义一个方法检查双向链表的长度'''                        			          
	def length(self):
		cur = self.__head
		count = 0
		while cur != None:
			count += 1
			cur = cur.next
		return count           #返回count的值即为双链表的长度
		
	'''定义一个方法遍历双向链表'''
	def traversal(self):
		cur = self.__head
		while cur != None:
			print(cur.item)         #输出双向链表中的每个元素
			cur = cur.next
	
	'''定义一个方法向双向链表的尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		cur = self.__head
		if cur:
			while cur.next != None:
				cur = cur.next
			cur.next = node
			node.prev = cur
		else:
			self.__head = node


	'''定义一个方法向双向链表的头部添加元素'''
	def add(self,item):
		'''首先创建一个节点'''
		node = Node(item)
		if self.is_empty():        
			self.__head = node       #当为空链表时
		else:                        #当双链表非空时
			self.__head.prev = node    
			node.next = self.__head
			self.__head = node

	'''定义一个方法用于在双向链表的指定位置插入元素'''
	def insert(self,pos,item):
		'''指定位置插入元素'''
		if pos <= 0:
			self.add(item)
		elif pos > (self.length()-1):
			self.append(item)
		else:
			node = Node(item)
			count = 0
			cur = self.__head
			while count < pos:
				count += 1
				cur = cur.next
			node.next = cur
			cur.prev.next = node
			node.prev = cur.prev
			cur.prev = node	

	'''定义一个方法用于搜索指定元素'''
	def search(self,item):
		cur = self.__head
		while cur != None:
			if cur.item == item:
				return True
			else:
				cur = cur.next
		return False

	'''定义一个方法用来删除双向链表中指定的元素'''
	def remove(self,item):
		cur = self.__head
		while cur != None:
			if cur.item == item:
				if cur == self.__head:
					if self.__head.next:
						self.__head = cur.next
						cur.next.prev = None
					else:
						self.__head = None
				elif cur.next:
					cur.prev.next = cur.next
					cur.next.prev = cur.prev
				else:
					cur.prev.next = None
				break
			else:
				cur = cur.next	
	
					
			
	
'''实例化创建一个具体数据值为20的节点'''
node = Node(20)

'''实例化创建一个空的双向链表'''
link = DoubleLink()

'''实例化创建含有一个节点且节点具体数据值为20的双向链表'''
dou_link = DoubleLink(node)

'''删除双向链表中指定元素'''
link.append(1)
link.append(2)
link.append(3)
link.append(4)
link.append(5)
link.traversal()
link.remove(11)
link.remove(3)
link.traversal()

输出结果:

1
2
3
4
5
1
2
4
5

二.单向循环链表的操作

1.什么是单向循环链表

单向循环链表 :循环链表是一种特殊的单向链表,单向链表的最后一个节点的后继指针指向的是链表的头节点,这样的单向链表称为单向循环链表
在这里插入图片描述

2.单向循环链表的创建

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)
	

3.单向循环链表的操作

1.判断循环链表是否为空

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)

'''判断链表是否为空'''
print(link.is_empty())
print(lin.is_empty())

输出结果:

True
False

2.定义一个方法求循环链表的长度

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

	'''定义一个方法求循环链表的长度'''
	def length(self):
		count = 1
		cur = self.__head
		if self.__head:
			while cur.next != self.__head:
				count += 1
				cur = cur.next
		else:
			count = 0
		return count

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)

'''求循环链表的长度'''
print(link.length())
print(lin.length())

输出结果:

0
1

3.遍历循环链表元素

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

	'''定义一个方法求循环链表的长度'''
	def length(self):
		count = 1
		cur = self.__head
		if self.__head:
			while cur.next != self.__head:
				count += 1
				cur = cur.next
		else:
			count = 0
		return count

	'''定义一个方法用于遍历循环链表的元素'''
	def traversal(self):
		if self.__head:
			cur = self.__head
			while cur.next != self.__head:
				print(cur.item)
				cur = cur.next
			print(cur.item)
		else:
			pass
			

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)

'''遍历单向循环链表'''
link.traversal()
lin.traversal()

输出结果:

20

4.定义一个方法用于循环链表头部添加元素

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

	'''定义一个方法求循环链表的长度'''
	def length(self):
		count = 1
		cur = self.__head
		if self.__head:
			while cur.next != self.__head:
				count += 1
				cur = cur.next
		else:
			count = 0
		return count

	'''定义一个方法用于遍历循环链表的元素'''
	def traversal(self):
		if self.__head:
			cur = self.__head
			while cur.next != self.__head:
				print(cur.item)
				cur = cur.next
			print(cur.item)
		else:
			pass

	'''定义一个方法用于循环链表头部添加元素'''
	def add(self,item):
		'''先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			node.next = self.__head
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			self.__head = node
			cur.next = self.__head
		else:
			self.__head = node
			node.next = self.__head
		
		
			

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)

'''循环链表头部随意添加元素'''
link.add(10)
link.add('q')
link.add('a')
link.add(40)
'''遍历循环链表'''
link.traversal()

输出结果:

40
a
q
10

5.定义一个方法用于循环链表尾部添加元素

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

	'''定义一个方法求循环链表的长度'''
	def length(self):
		count = 1
		cur = self.__head
		if self.__head:
			while cur.next != self.__head:
				count += 1
				cur = cur.next
		else:
			count = 0
		return count

	'''定义一个方法用于遍历循环链表的元素'''
	def traversal(self):
		if self.__head:
			cur = self.__head
			while cur.next != self.__head:
				print(cur.item)
				cur = cur.next
			print(cur.item)
		else:
			pass

	'''定义一个方法用于循环链表头部添加元素'''
	def add(self,item):
		'''先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			node.next = self.__head
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			self.__head = node
			cur.next = self.__head
		else:
			self.__head = node
			node.next = self.__head

	'''定义一个方法用于循环链表尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			'''创建游标'''
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			cur.next = node
			node.next = self.__head
		else:
			self.__head = node
			node.next = self.__head
		
		
			

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)

'''循环链表尾部随意添加元素'''
link.append(1)
link.append(2)
link.append(3)
link.append(4)

'''遍历循环链表'''
link.traversal()

输出结果:

1
2
3
4

6.定义一个方法在循环链表指定位置添加元素

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

	'''定义一个方法求循环链表的长度'''
	def length(self):
		count = 1
		cur = self.__head
		if self.__head:
			while cur.next != self.__head:
				count += 1
				cur = cur.next
		else:
			count = 0
		return count

	'''定义一个方法用于遍历循环链表的元素'''
	def traversal(self):
		if self.__head:
			cur = self.__head
			while cur.next != self.__head:
				print(cur.item)
				cur = cur.next
			print(cur.item)
		else:
			pass

	'''定义一个方法用于循环链表头部添加元素'''
	def add(self,item):
		'''先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			node.next = self.__head
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			self.__head = node
			cur.next = self.__head
		else:
			self.__head = node
			node.next = self.__head

	'''定义一个方法用于循环链表尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			'''创建游标'''
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			cur.next = node
			node.next = self.__head
		else:
			self.__head = node
			node.next = self.__head

	'''定义一个方法在循环链表指定位置添加元素'''
	def insert(self,pos,item):
		'''首先创建一个节点'''
		node = CircularNode(item)
		if pos <= 0:
			self.add(item)
		elif pos > (self.length() - 1):
			self.append(item)
		else:
			count = 0
			cur = self.__head
			while count < pos-1:
				cur = cur.next
				count += 1
			node.next = cur.next
			cur.next = node
		
		
			

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)



'''循环链表指定位置添加元素'''
link.insert(1,'a')
link.insert(0,'b')
link.insert(8,'c')
link.insert(1,'second')

'''遍历循环链表'''
link.traversal()

输出结果:

b
second
a
c

7.定义一个方法查看指定元素是否在循环链表中,若在则返回True,否则返回False

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

	'''定义一个方法求循环链表的长度'''
	def length(self):
		count = 1
		cur = self.__head
		if self.__head:
			while cur.next != self.__head:
				count += 1
				cur = cur.next
		else:
			count = 0
		return count

	'''定义一个方法用于遍历循环链表的元素'''
	def traversal(self):
		if self.__head:
			cur = self.__head
			while cur.next != self.__head:
				print(cur.item)
				cur = cur.next
			print(cur.item)
		else:
			pass

	'''定义一个方法用于循环链表头部添加元素'''
	def add(self,item):
		'''先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			node.next = self.__head
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			self.__head = node
			cur.next = self.__head
		else:
			self.__head = node
			node.next = self.__head

	'''定义一个方法用于循环链表尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			'''创建游标'''
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			cur.next = node
			node.next = self.__head
		else:
			self.__head = node
			node.next = self.__head

	'''定义一个方法在循环链表指定位置添加元素'''
	def insert(self,pos,item):
		'''首先创建一个节点'''
		node = CircularNode(item)
		if pos <= 0:
			self.add(item)
		elif pos > (self.length() - 1):
			self.append(item)
		else:
			count = 0
			cur = self.__head
			while count < pos-1:
				cur = cur.next
				count += 1
			node.next = cur.next
			cur.next = node

	'''定义一个方法查看指定元素是否在循环链表中'''
	def search(self,item):
		if self.is_empty():
			return False
		else:
			cur = self.__head
			while cur.next != self.__head:
				if cur.item  == item:
					return True
				else:
					cur = cur.next
			if cur.item == item:
				return True
			else:
				return False
			 
		
		
			

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)

'''搜索指定元素是否在循环链表中'''
print(link.search(30))
print(lin.search(20))
print(lin.search(66))

输出结果:

False
True
False

8.定义一个方法删除循环链表中指定元素

'''创建单向循环链表节点模板'''
class CircularNode(object):
	'''创建单向循环链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None

'''创建单向循环链表模板'''
class SinglecircularLink(object):
	'''创建单向循环链表'''
	def __init__(self,node = None):
		self.__head = node
		if self.__head:
			node.next = self.__head

	'''定义一个方法判断一个循环链表是否为空链表,若为空链表则返回True,否则返回False'''
	def is_empty(self):
		return self.__head == None

	'''定义一个方法求循环链表的长度'''
	def length(self):
		count = 1
		cur = self.__head
		if self.__head:
			while cur.next != self.__head:
				count += 1
				cur = cur.next
		else:
			count = 0
		return count

	'''定义一个方法用于遍历循环链表的元素'''
	def traversal(self):
		if self.__head:
			cur = self.__head
			while cur.next != self.__head:
				print(cur.item)
				cur = cur.next
			print(cur.item)
		else:
			pass

	'''定义一个方法用于循环链表头部添加元素'''
	def add(self,item):
		'''先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			node.next = self.__head
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			self.__head = node
			cur.next = self.__head
		else:
			self.__head = node
			node.next = self.__head

	'''定义一个方法用于循环链表尾部添加元素'''
	def append(self,item):
		'''首先创建一个节点'''
		node = CircularNode(item)
		if self.__head:
			'''创建游标'''
			cur = self.__head
			while cur.next != self.__head:
				cur = cur.next
			cur.next = node
			node.next = self.__head
		else:
			self.__head = node
			node.next = self.__head

	'''定义一个方法在循环链表指定位置添加元素'''
	def insert(self,pos,item):
		'''首先创建一个节点'''
		node = CircularNode(item)
		if pos <= 0:
			self.add(item)
		elif pos > (self.length() - 1):
			self.append(item)
		else:
			count = 0
			cur = self.__head
			while count < pos-1:
				cur = cur.next
				count += 1
			node.next = cur.next
			cur.next = node

	'''定义一个方法查看指定元素是否在循环链表中'''
	def search(self,item):
		if self.is_empty():
			return False
		else:
			cur = self.__head
			while cur.next != self.__head:
				if cur.item  == item:
					return True
				else:
					cur = cur.next
			if cur.item == item:
				return True
			else:
				return False

	'''定义一个方法删除循环链表中指定元素'''
	def remove(self,item):
		cur = self.__head
		prev = None
		if self.is_empty():
			return
		elif self.__head.item == item:
			if self.__head.next != self.__head:
				while cur.next != self.__head:
					cur = cur.next
				self.__head = self.__head.next
				cur.next = self.__head
			else:
				self.__head = None
		else:			
			while cur.next != self.__head:
				if cur.item == item:
					prev.next = cur.next
					break
				else:
					prev = cur
					cur = cur.next
			if cur.item == item:
				prev.next = cur.next
			else:
				return
				
				
			 
		
		
			

'''实例化创建循环链表节点'''
node = CircularNode(20)

'''实例化创建空循环链表'''
link = SinglecircularLink() 

'''实例化创建循环链表'''
lin = SinglecircularLink(node)

'''随意添加元素'''
link.append(1)
link.append(2)
link.append(3)
link.append(4)

'''遍历循环链表'''
link.traversal()

'''删除指定元素'''
link.remove(2)

'''遍历循环链表'''
link.traversal()

输出结果:

1
2
3
4
1
3
4

三.定义一个函数实现将字符串的前n位进行左旋

def trval(element,n):
	s1 = element[:n]
	s2 = element[n:]
	a = s2 + s1
	return a

print(trval('hello',3))

输出结果:

lohel
### 单向链表 单向链表是一种线性的数据结构,其中每个节点包含两部分:一部分用于存储实际的数据;另一部分是一个指针,指向下一个节点的位置。这种特性使得单向链表中的元素只能按顺序从前至后访问。 ```c struct Node { int data; struct Node* next; // 指向下一个节点的地址 }; ``` 由于单向链表只维护了一个方向上的链接关系,因此对于给定的一个节点来说,仅能通过`next`成员变量来获取其后的节点信息[^1]。 ### 双向链表 为了克服单向链表只能向前遍历的问题,双向链表在设计上增加了额外的信息——除了保留原有的指向后续节点(`next`)外,还加入了另一个指针用来指示当前节点之前的那个节点(`prev`)。这允许程序不仅能够顺着列表前进读取各个项目,同时也支持逆序操作,即可以从任一选定位置往回检索直至起始处。 ```c struct DNode { int data; struct DNode *prev, *next; // prev指向上一个节点,next指向下一个节点 }; ``` 这样的改进虽然提高了灵活性,但也相应地增加了一些复杂度以及占用更多的内存空间[^2]。 ### 循环链表 循环链表的特点在于它形成了闭合路径,无论是单向还是双向形式下最后一个节点都连接回到第一个节点形成闭环。这意味着当到达链尾之后继续沿同一方向移动会重新进入序列头部而不是终止于null值结束状态。这一性质特别适用于某些特定应用场景比如实现约瑟夫斯问题或是管理固定大小资源池等场合。 #### 对于单向循环链表: ```c // 假设head是指向头结点的指针,则可以通过如下方式判断是否已经绕了一圈回到了起点 if (current->next == head) { /* 已经完成一圈 */ } ``` 而对于双向循环链表而言,同样遵循上述逻辑只不过两端都有相应的前后关联。 --- 总结三者的差异主要体现在以下几个方面: - **遍历能力**:单向链表只能正向迭代直到遇到NULL为止;而双向链表既可顺次也可倒叙行走;至于循环版本无论哪种形态都能无尽头地环绕整个链条。 - **内存消耗**:相较于其他两种变体,标准型(非循环)单向链表所需储存单元最少因为它只需要保存单一方向上的邻接关系;相反地,双端附加了反向索引自然要多耗费一些位元记录这些新增加的关系字段;最后,尽管同样是围绕成圆状排列,但因其实现细节的不同可能会造成不同程度的空间开销变化。 - **适用场景**:如果应用程序频繁涉及从末端返回开头的操作那么显然采用具备双向导航特性的容器更为合适;反之若是单纯追求简单高效则优先考虑最基础款式的单列队列即可满足需求;另外针对那些需要不断重复利用有限集合内全部成员的情况选用循环模式无疑是个明智的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值