算法20中,la为双向链表的头指针,直接用头指针表示和
算法20中,la为双向链表的头指针,直接用头指针表示和操作双向链表。
20·设有一个双向链表la,每个结点中除有prior、data和next域外,还有一个访问频度freq域,在链表被使用之前,freq域初始化为零。每当在链表进行一次locate(x)运算后,令值为X的结点中的freq域增1,并调整表中结点的次序,使其按访问频度的递减序列排列,以便使频繁访问的结点总是靠近表头。设计满足上述要求的locate(x)算法。
答案
class DNode: def __init__(self, data): self.data = data self.freq = 0 self.prior = None self.next = None class DLinkList: def __init__(self): self.head = DNode(None) #头结点 def locate(self, x): #1查找x p = self.head.next while p and p.data != x: p = p.next if not p: return None p.freq += 1 #摘除p pre_node = p.prior nxt_node = p.next pre_node.next = nxt_node if nxt_node: nxt_node.prior = pre_node #找插入位置q:第一个freq < p.freq q = self.head.next while q and q.freq >= p.freq: q = q.next #插入p到q前面 p.next = q p.prior = q.prior q.prior.next = p q.prior = p return p