设L是一个长度为n的双向链表,存储于长度为m的数组key、prev和next中。假设这些数组由维护双链自由表F的两个过程ALLOCATE-OBJECT和FREE-OBJECT进行管理。又假设m个元素中,恰有n个元素在链表L上,m-n个在自由表上。给定链表L和自由表F,试写出一个过程COMPACTIFY-LIST(L, F),用来移动L中的元素使其占用数组的1,2,...,n的位置,调整自由表F以保持其正确性,并且占用数组中n+1,n+2,...,m的位置。要求所写的过程运行时间应为,且只使用固定量的额外储存空间。请证明所写的过程是正确的。
关于上面标红的那个“双链自由表”,原文是这样
Suppose that these arrays are managed by ALLOCATE-OBJECT and FREE-OBJECT procedures that keep a doubly linked free list F
英语不太好,按个人理解就是自由表也是双链。。。
ALLOCATE-OBJECT过程从自由表里返回一个可用元素位置
FREE-OBJECT过程将链表中一个元素占用位置释放到自由表
先写一下大概的解决思路
1、按下标1到n对数组进行遍历,找一个自由表的元素(因为自由表没有key属性,根据key数组是否存在元素来判断是否属于自由表),进入2;若未找到说明已满足要求,进入3
2、遍历链表,找一个坐标大于n的元素,交换其与1中找到元素,返回1
3、过程结束
COMPACTIFY-LIST(L, F)
x = L.head
for i = 1 to n
if i.key == nil # 找到自由表元素
while x <= n and x.next != nil
x = x.next
i.key, x.key = x.key, nil # 值交换
i.prev.next, i.next.prev = x.prev.next, x.next.prev
i.prev, i.next = x.prev, x.next
感觉怪怪的。。。