算法导论 练习10.2-8

说明如何在每个元素仅使用一个指针 x.np(而不是通常的两个指针 next 和 prev)的情况下实现双向链表。假设所有指针的值都可视为k位的整型数,且定义 x.np = x.next XOR x.prev,即 x.next 和 x.prev 的k位异或。(NIL的值用0表示。)注意要说明获取表头所需的信息,并说明如何在该表上实现SEARCH、INSERT和DELETE操作,以及如何在O(1)时间内实现该表的逆转。

主要是在原答案的基础上加了些注释。。。

基于A = C XOR (A XOR C)

SEARCH(L, k)
    p = L.head                
    x = L.head.np          
    while x != NIL and x.key != k do    # 循环直到链表尾,或找到查询元素
        temp = x           # temp寄存当前元素
        x = (p XOR x.np)   # p是上一个元素,于是 p XOR x.np 是x的下一个元素,将其赋予x
        p = temp           # 更新p为寄存的未更新时的x,即现在x的上一个元素
    end while              # 结束循环
    return x               # 返回x,为找到的元素(非0)或未找到(0)
INSERT(L, x)
    x.np = L.head                    # x指向L.head
    L.head.np = x XOR L.head.np      # L.head指向x和x1                                
    L.head, x = x, L.head            # L.head、x易位
DELETE(L, k)
    p = L.head
    x = L.head.np
    while x != NIL and x.key != k do
        temp = x
        x = p XOR x.np
        p = temp
    end while
    # p为x上一个元素,x为找到的元素
    # p.np →(p之前一个元素,x)
    # x.np XOR p = x的下一个元素
    p.np = p.np XOR (x XOR (x.np XOR p))
    (x.np XOR p).np = p XOR (x XOR (x.np XOR p).np)
REVERSE(L)
    L.head, L.nil = L.nil, L.head

还是感觉做的有问题。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值