双向链表基本操作的 Python 实现

双向链表的基本操作的实现

在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现双向链表的如下操作。(用到的工具是Python 3)

is_empty() : 判断链表是否为空
length() : 返回链表的长度
travel() : 遍历
add(item) : 在头部添加一个节点
append(item) : 在尾部添加一个节点
insert(pos, item) : 在指定位置 pos 添加一个节点
remove(item) :  删除一个节点
search(item) :  查找节点是否存在

Python实现

class Node(object):
	'''双向链表节点'''
	def __init__(self,item):
		self.item = item
		self.next = None
		self.prev = None
class DoubleLink(object):
	'''双向链表'''
	def __init__(self):
		self._head = None
	
	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
	
	def travel(self):
		'''遍历链表'''
		cur = self._head
		while cur != None:
			print(cur.item)
			cur = cur.next
		print("")
	
	def add(self, item):
		'''头部插入元素'''
		node = Node(item)
		if self.is_empty():
			# 如果是空链表,将_head指向None
			self._head = node
		else:
			# 将node的next指向_head的头节点
			node.next = self._head
			# 将_head的头节点的prev指向node
			self._head.prev = node
			# 将_head 指向node
			self._head = node
	
	def append(self, item):
		'''尾部插入元素'''
		node = Node(item)
		if self.is_empty():
			self._head = node
		else:
			# 移动到链表尾部
			cur = self._head
			while cur.next != None:
				cur = cur.next
			# 将尾结点cur的next指向node
			cur.next = node
			# 将node的prev指向cur
			node.prev = cur
	
	def search(self, item):
		'''查找元素是否存在'''
		cur = self._head
		while cur != None:
			if cur.item == item:
				return True
			cur = cur.next
		return False

指定位置插入节点

在该操作中,要注意链的指向的先后顺序。
33

	def insert(self, pos, item):
		'''在指定位置添加节点'''
		if pos <= 0:
			self.add(item)
		elif pos > (self.length() - 1):
			self.append(item)
		else:
			node = Node()
			cur = self._head()
			count = 0
			# 移动到指定的前一个位置
			while cur < pos - 1 :
				count += 1
				cur = cur.next
			# 将node的prev指向cur
			node.prev = cur
			# 将node的next指向cur的下一个节点
			node.next = cur.next
			# 将cur的下一个节点的prev指向node
			cur.next.prev = node
			# 将cur.next指向node
			cur.next = node		

删除元素
在这里插入图片描述

	def remove(self, item):
		'''删除元素'''
		if self.is_empty(): return 
		else:
			cur = self._head
			if cur.item == item:
				# 如果首节点的元素是要删除的元素
				if cur.next == None:
					# 如果链表中只有一个节点
					self._head = None
				else:
					cur.next.prev = None
					self._head = cur.next
				return
			while cur != None:
				if cur.item == item:
					cur.prev.next = cur.next
					cur.next.prev = cur.prev
					break
				cur = cur.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值