分析与解答:
假设链表中已有y个元素,并且已经紧凑排列。令top = y +1,表示下一个将要分配的指针位置
在分配空间时很简单:
ALLOCATE-OBJECT分配时,只需要top++,同时在双链表L的头部增加一个元素。
在释放空间时稍微复杂:
FREE-OBJECT释放时,若x和y相同,则只需要从双链表L中删除元素x,同时top--;若x<y,则需要将x删除,同时将元素y调整到x的位置,然后top--
整个过程如下:
- ALLOCATE-OBJECT()
- y ← top[free]
- if y > m
- then error "out of memory"
- if head[L] ≠ NIL
- then prev[head[L]] = y
- next[y] ← head[L]
- prev[y] ← NIL
- head[L] ← y
- top[free] ← top[free]+1
- FREE-OBJECT(x)
- y ← top[free]-1
- if next[x] ≠ NIL
- then prev[next[x]] ← prev[x]
- if prev[x] ≠ NIL
- then next[prev[x]] ← next[x]
- else head[L] ← next[x]
- prev[x] ← prev[y]
- next[x] ← next[y]
- key[x] ← key[y]
- if prev[y] ≠ NIL
- next[prev[y]] ← x
- if next[y] ≠ NIL
- prev[next[y]] ← x
- top[free] ← top[free]-1
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个元素进行交换,每次交换仅需要常量的额外空间。
整个过程如下:
- COMPACTIFY-LIST(L, F)
- x ← head[L]
- num ← 0
- while x ≠ NIL
- do num ← num+1
- if x ≠ num
- then SWAP-OBJECT(x, num)
- x ← next[x]
- SWAP-OBJECT(i, j)
- exchange A[i] ↔ A[j]
- if prev[i] ≠ NIL
- then next[prev[i]] ← j
- if next[i] ≠ NIL
- then prev[next[i]] ← j
- if prev[j] ≠ NIL
- then next[prev[j]] ← i
- if next[j] ≠ NIL
- then prev[next[j]] ← i