算法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

题目信息

题号:8244
题型:简答题
知识点:Python
难度:普通