带表头的双向链表

本文介绍了如何设计一个带表头的双向链表,包括插入、删除、获取大小、判断空链表、遍历和获取指定位置元素等操作。提供了相应的代码实现,并鼓励读者进行测试与交流。

写在前面: 我是「虐猫人薛定谔i」,一个不满足于现状,有梦想,有追求的00后
\quad
本博客主要记录和分享自己毕生所学的知识,欢迎关注,第一时间获取更新。
\quad
不忘初心,方得始终。
\quad

❤❤❤❤❤❤❤❤❤❤

设计要求

设计一个带表头的双向链表,提供以下方法:
(1)insert_by_pos:在某个位置插入;
(2)insert:在链表的最后插入;
(3)delete_by_pos:在某个位置删除;
(4)delete:删除链表中与x相同的元素;
(5)getSize:返回当前链表中元素的个数;
(6)isEmpty:判断链表是否为空;
(7)traverse:遍历链表,打印出所有的元素;
(8)getData:取得某个位置的元素。
构造main函数进行测试。

代码

# 结点类
class Node:
	def __init__(self, data, Pre=None, Next=None):
		self.pre = Pre
		self.next = Next
		self.data = data 

# 双向链表类
class DoubleLinkedList:
	def __init__(self):
		self.size = 0
		self.head = Node(-1)

	def getSize(self):
		return self.size

	def isEmpty(self):
		return self.size == 0

	def traverse(self):
		if self.head == None:
			return False
		else:
			p = self.head.next
			while p != None:
				print(p.data, end=' ')
				p = p.next
			print('')
			return True

	def getData(self ,pos):
		if pos <1 or pos > self.size:
			return None
		else:
			cnt = 1
			p = self.head.next
			while p != None:
				if cnt == pos:
					return p.data
				p = p.next
				cnt += 1
			return None

	def insert_by_pos(self, pos, data):
		if pos < 1 or pos > self.size + 1:
			return False
		elif pos == 1:
			q = Node(data)
			self.head.next.pre = q
			q.next = self.head.next
			q.pre = self.head
			self.head.next = q
			self.size += 1
			return True
		else:
			cnt = 1
			p = self.head.next
			while p != None:
				if cnt == pos:
					q = Node(data)
					p.pre.next = q
					q.pre = p.pre
					q.next = p.next
					p.next.pre = q
					self.size += 1
					return True
				p = p.next
				cnt += 1
			return False

	def insert(self, data):
		if self.size == 0:
			q = Node(data)
			self.head.next = q
			q.pre = self.head
			self.size += 1
			return True
		else:
			p = self.head
			while p.next != None:
				p = p.next
			q = Node(data)
			p.next = q
			q.pre = p
			self.size += 1
			return True

	def delete(self, x):
		if self.size == 0:
			return False
		else:
			p = self.head.next
			while p != None:
				if p.data == x:
					p.pre.next = p.next
					p.next.pre = p.pre
					self.size -= 1
					return True
				p = p.next
			return False

	def delete_by_pos(self, pos):
		if pos < 1 or pos > self.size:
			return False
		else:
			p = self.head.next
			cnt = 1
			while p != None:
				if pos == cnt:
					p.pre.next = p.next
					p.next.pre = p.pre
					self.size -= 1
					return True
				p = p.next
				cnt += 1
			return False


# 测试
def main():
	dll = DoubleLinkedList()
	for i in range(10):
		dll.insert(i)
	if dll.isEmpty():
		print("链表已经空了")
	else:
		print("链表中元素的数量为:", dll.getSize())
		dll.traverse()
	if dll.insert_by_pos(1, 100):
		print("---- 插入成功 ----")
	else:
		print("---- 插入失败 ----")
	dll.traverse()
	for i in range(1, dll.getSize()+1):
		print("第%d个位置的元素为:" % i, dll.getData(i))
	if dll.delete_by_pos(5):
		print("删除成功")
		dll.traverse()
	else:
		print("删除失败")
	if dll.insert_by_pos(1, 100):
		print("插入成功")
		dll.traverse()
	else:
		print("插入失败")
	if dll.delete(6):
		print("删除成功")
		dll.traverse()
	else:
		print("删除失败")


if __name__ == '__main__':
	main()

测试

在这里插入图片描述
在这里插入图片描述

蒟蒻写博客不易,如果有误还请大佬们提出
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:虐猫人薛定谔i
博客地址:https://blog.youkuaiyun.com/Deep___Learning

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值