小白超详细总结----数据结构与算法(二)

上一章我们将到了单链表,这里我们将提到双链表和单项循环列表,以及其对应的一些内置方法。

双链表

单链表的每个节点只能记录下一个节点的位置,而双链表的节点不仅可以记录下一个节点也可以记录上一个节点。所以,节点有三个属性–pre (指向上一个节点)–data(节点的值)–next(指向下一个节点)。
在这里插入图片描述

class Node():
	def __init__(self,data):
		self.pre=None
		self.data=data
		self.next=None

在双链表中的一些常用内置方法,一般在做插入等操作时,可以进行画图分析,要学会使用双指针的思想。

class DoubleLink():
	def __init__(self):
		self._head=None
	def is_empty(self):#双链表是否为空
		if self._head==None:
			return True
		else:
			return False
	def length(self):#双链表的长度
		if self.is_empty():
			return 0
		else:
			cur=self._head
			count=0
			while cur!=None:
				cur=cur.next
				count+=1
			return count
	def add(self,data):#头部添加元素
		node=Node(data)
		if self.is_empty():
			self._head=node
		else:
			node.next=self._head
			self._head.pre=node
			self._head=node
	def travel(self):#遍历双链表
		cur=self._head
		while cur!=None:
			print cur.data
			cur=cur.next
	def append(self,data)##在双链表后面添加元素
		node=Node(data)
		if self.is_empty():
			self._head=node
		else:
			cur=self._head
			while cur.next!=None
				cur=cur.next
			cur.next=node#将尾节点的next指向node
			node.pre=cur#将node的pre指向尾节点
	def insert(self,pos,data):
		node=Node(data)
		if pos<=0:
			self.add(data)
		if pos>=(self.length()-1):
			self.append(data)
		else:
			cur=self._head
			#prev=None
			for i in range(pos-1):###移动到指定位置的前一个节点
				#prev=cur
				cur=cur.next
			###添加进去的节点pre指向cur
			node.pre=cur
			###添加进去的节点next指向cur的下一个节点
			node.next=cur.next
			cur.next.pre=node
			cur.next=node
			
:

单向循环链表

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
在这里插入图片描述

class Node():
	def __init__(self,data):
		self.data=data
		self.next
class CriLinked():
	def __init__(self):
		self._head=None
	def is_empty(self):#判断链表是否为空
		if self._head=None:
			return True
		else:return False
	def add(self,data):###头部添加元素
		if self.is_empty():
			self._head=node
			node.next=self._head
		else:
			node=Node(data)
			cur=self._head
			while cur.next!=self._head
				cur=cur.next
			cur.next=node
			node.next=self._head
			self._head=node
	def insert(self,pos,data):#在指定位置添加节点
		node=Node(data)
		if pos<=0:
			self.add(data)
		if pos>(self.length()-1):
			self.append(data)
		else:
			cur=self._head
			count=0
			while count<pos-1:
				cur=cur.next
			node.next=cur.next
			cur.next=node
	def remove(self, item):#删除一个节点
	    if self.is_empty():
	    	return None
	    cur=self._head
	    pre=None
	    if cur.data==item: # 若头节点的元素就是要查找的元素item
				# 如果链表不止一个节点
	    	if cur.next==self._head:
	    		while cur.next!=self._head:
	    			cur=cur.next
	    		cur.next=self._head.next
	    		self._head=self._head.next
	    else:
	    	pre=self._head# 第一个节点不是要删除的
	    	while cur.next!=self._head:
	    		if cur.data==item:
	    			pre.next=cur.next
	    		else:
	    			pre=cur
	    			cur=cur.next
	    	if cur.data==item: # cur 指向尾节点
	    		pre.next=cur.next
	    		 
	    			

猜你喜欢

转载自blog.csdn.net/qq_43440040/article/details/107574097
今日推荐