<算法导论>练习10.2

本文探讨了如何在链表中常量时间插入和删除元素,重点介绍了使用链表模拟栈和队列的数据结构,包括push、pop操作,以及如何在队列中实现先进先出的特性。通过代码示例展示了如何在Python中操作链表进行这些操作,同时讨论了哨兵节点和特殊情况处理。
摘要由CSDN通过智能技术生成

10.2-1
插入可以在常量的时间内完成,只需要将其插入到特定的位置比如链表的开始或结尾即可。
删除元素需要找到要删除元素的位置,无法在常量的时间内完成,除非删除的元素在链表的开始或结尾。
10.2-2
栈的特点是先进后出以链表来模拟的话,插入删除操作均在链表头完成即可。
代码如下:

def push(l,x):
	x.next=l.head
	l.head=x
def pop(l):
	if l.head==None:
		return "error"
	else:
		x=l.head
		l.head=x.next
		return x    #将栈顶元素弹出

10.2-3
用单链表实现一个队列,队列的特点是先进先出,那么插入在链表尾进行,删除在链表头进行即可。

def push(l,x):
	#l是链表,x是要插入的元素
	if l.head==NULL:
		l.head=x
	else:
		l.tail=x   #l.tail是指向尾节点的哨兵,正常来说需要从头一步一步走到尾节点
		x.next=NULL
	
def pop():
	if l.head==NULL :
		return "error"
	else :
		x=l.head
		l.head=l.head.next
		return x      #弹出头节点

10.2-4
如果已知链表的长度,就可以以计数的方式忽略对哨兵的检查。
不过书中的list_search’函数,在链表中没有k的时候返回的是头节点,如果把哨兵L.nil的属性值设为k的话,可以不加判断,若链表中不存在k的话,返回哨兵。但这样有可能会造成误判。所以最好还是保留判断。
10.2-5
l表示链表,l.head 表示头节点,l.nil 表示尾节点,x表示要插入或要删除的节点。

def insert(l,x)
	if l.nil.next==l.head:
		return "L is full"
	else :
		l.nil.next=x
		x=l.nil

def delete(l,x):
	p=l.head
	while p.next!=x:
		if p.next==l.nil:
			return "x is not exist"
		else:
			p=p.next
	p.next=x.next
	x.next=NULL
	del x #释放掉x所占存储空间

def search(l,x):
	p=l.head
	while p.next!=x:
		if p.next==l.nil:
			error "x is not exist "
	return p.next

10.2-6
把第一个链表的尾节点的下一个元素改为第二个链表的头元素即可,如果有哨兵的话,把第二个链表的哨兵去掉,并把尾节点的下一个元素指向第一个链表的哨兵。

10.2-7
题意为反转链表。
假设已知链表为L

def reverse_list(l):
	p=l.head
	q=p.next
	while q.next:
		t=q.next
		q.next=p
		p=q
		q=t
	head.next=NULL
	q.next=p
	return q
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值