Java教程

<算法导论>练习10.2

本文主要是介绍<算法导论>练习10.2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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
这篇关于<算法导论>练习10.2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!