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