10.3-5 设L是一长度为m的双链表,存储在长度为n的数组key、next和prev中。假设这些数组由维护双链自由表F的两个过程ALLOCATE-OBJECT和FREE-OBJECT来操纵。进一步假设在数组的n个元素中,有m个在表L和自由表F,移动L中的元素,使他们占有数组中的1, 2, ..., m位置,同时调节自由表F使之保持正确,并占有数组位置m+1, m+2, ..., n。所给出的运行时间应该是Θ(m),且只能使用固定量的额外空间。请仔细论证你所给出的过程的正确性。
分析与解答:
如下图所示,长度为m的双链表L存储在长度为n的数组中,自由表为F。为了使双链表分布更加紧凑,我们将移动L中的元素,使其占有数组中的1, 2, ..., m位置。
我们可以采用交换的手法,将L中的第1个元素和数组第1个位置的元素进行交换,一次类推,L中的第m个位置的元素和数组的第m个元素进行交换,每次交换仅需要常量的额外空间。
整个过程如下: