python数据结构之链表操作-----双链表4

'''
	由上面单链表的操作可以看出,无论是带尾部标识,或者是循环链表,尾部插入数据的时候其时间复杂度都为O(n)
	这里考虑一下,双链表。即,链表的一节,可以指向后一节数据,也可以指向前一节数据。
'''
class DNode:
	def __init__(self, elem_, prev_ = None, next_ = None):
		self._elem = elem_
		self._prev = prev_
		self._next = next_


class DLList:
	def __init__(self, head_ = None, rear_ = None):
		self._head = head_
		self._rear = rear_

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

	# 从链表前插入数据
	def prepend(self, elem):
		p = DNode(elem, prev_ = None, next_ = self._head)
		if self.is_empty():
			self._rear = p

		else:
			p._next = self._head
			self._head._prev = p
		self._head = p

	# 从链表后插入数据
	def append(self, elem):
		p = DNode(elem, prev_ = self._rear, next_ = None)
		if self.is_empty():
			self._head = p

		else:
			self._rear._next = p
		self._rear = p

	# 从链表的头部删除数据
	def pop(self):
		if self.is_empty():
			raise ValueError("链表为空")

		if self._head is self._rear:
			
			e = self._head._elem
			self._head = None
			self._rear = None

		else:
			e = self._head._elem
			self._head = self._head._next
			self._head._prev = None

		return e

	def pop_last(self):

		if self.is_empty():
			raise ValueError("链表为空")

		if self._head is self._rear:
			e = self._head._elem
			self._head = None
			self._rear = None

		else:
			e = self._rear._elem
			self._rear = self._rear._prev
			self._rear._next = None

		return e

	def __str__(self):

		if self.is_empty():
			return ""

		part = ""
		p = self._head
		while p._next:
			part += str(p._elem) + ", "
			p = p._next

		part += str(self._rear._elem)

		return part

	# 对链表进行反转操作, 这种换数据的方法比前面文章1的方法,利用前方向指针,将时间复杂度降到O(1)
	# 至于改变链表结构的方法,好像跟文章1的方式基本相同
	def reverse1(self):

		# 当链表为空或者只有一个数据时,不需要反转
		if self.is_empty() or self._head is self._rear:
			return 

		p = self._head
		q = self._rear
		while True:
			if p is q:
				break

			elif p._next is q:
				p._elem, q._elem = q._elem, p._elem
				break

			else:
				p._elem, q._elem = q._elem, p._elem
				p = p._next
				q = q._prev

	# 至于排序操作,跟文章1的方式基本相同

data = DLList()
for i in range(10):
	data.prepend(i)

print(data, "\n--------------\n")
data.reverse1()
print(data)













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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值