要求:

Explain how to implement doubly linked lists using only one pointer value x.np per
item instead of the usual two (next and prev). Assume that all pointer values can be
interpreted as k-bit integers, and define x.np to be x.np = x.next XOR x.prev,
the k-bit “exclusive-or” of x.next and x.prev. (The value NIL is represented by 0.)
Be sure to describe what information you need to access the head of the list. Show
how to implement the SEARCH, INSERT, and DELETE operations on such a list.
Also show how to reverse such a list in O(1) time.

解法:

x.np = x.prev ^ x.next

NIL用0表示

考虑链表第一个元素x.np = NIL ^ x.next = x.next,即链表头存的指针值和普通双向链表的next指针相同

中间所有元素x.np = x.prev ^ x.next

考虑链表最后一个元素x.np = x.prev ^ NIL = x.prev,即链表最后一个元素存的指针和普通双向链表的prev指针相同

我们知道第一个元素的next指针,中间元素的next指针可以通过前一个元素的np和当前元素的np异或计算获得,这就为前序遍历创造了可能

我们知道最后一个元素的prev指针,中间元素的prev指针可以通过当前元素的np和后一个元素的np异或计算获得,这就为后续遍历创造了可能

总之,np = prev ^ next, NIL = 0致使链表头元素和尾元素np值具有了特殊性,这正是此种表示的精妙之处,节省了O(n)的空间开销,但增加了运算开销(位运算),计算机执行位运算具有速度优势。

此种情况下,如果想要翻转链表就变得异常容易,只需要将链表的头尾指针交换即可。

CLRS10.2-8练习 - 单指针值实现双向链表的更多相关文章

  1. 用jQuery获取表单的值

    在日常开发过程中,有许多用到表单的地方.比如登录,注册,比如支付,填写订单,比如后台管理等等. 使用jQuery来获取表单的值是比较常见的做法. 常见表单 单行文字域:<input type=' ...

  2. JS表单设置值

    //表单设置值 $.fn.setForm = function(jsonValue) { var obj = this; $.each(jsonValue, function (name, ival) ...

  3. asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)

    原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...

  4. Jquery Form表单取值

    之前js取form表单的值都是一个一个的取,数量一多之后容易出错而且烦透了.感谢那些愿意分享的人. 页面定义form,并给form指定id值,里面的元素只要是需要键值对应的都赋予name属性,并且na ...

  5. c指针 --笔记2返回指针值的函数

    返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int arg ...

  6. 取值:form表单取值、input框绑定取值

    1. form表单取值1.1 方式一,通过<form bindsubmit="formSubmit">与<button formType="submit ...

  7. 用 malloc 或 new 申请内存之后,应该立即检查指针值是否为 NULL

    用 malloc 或 new 申请内存之后,应该立即检查指针值是否为 NULL. 防止使用指针值为 NULL 的内存. #include <iostream> #include <s ...

  8. 【antd】form表单默认值设置

    问题: 在antd的form表单的api里面有个"initialValues"可以设置默认值.但是表单没有更新 <Form name="test" for ...

  9. jQuery name属性与checked属性结合获取表单元素值

    var paytype = $("input[name='paytype']:checked").val(); alert(paytype); input元素下名称为paytype ...

随机推荐

  1. pycharm进行个性化设置

    1. 设置主题:Monokai Ctrl+Alt+S: Editor->Color&Fonts->Python 2. 修改[选中内容]颜色 因为用了Monokai主题后,选中内容的 ...

  2. A%G^C006

    AGC006 快乐翻题解\(\sqrt{}\) A Prefix and Suffix 这一场我怎么一道都不会啊/kk https://agc006.contest.atcoder.jp/submis ...

  3. SQLSERVER获取数据库中的所有表的名称、表中所有字段的属性

    1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FR ...

  4. 一种Winform类electron的实现

    最近看了一篇文章  Winform客户端内嵌Vue页面  使用html作为winform的界面(其实这种做法早在MFC时代就已经有了),不过感觉文章中的封装并不够彻底,所以我忍不住要发一篇博客来说说我 ...

  5. GoodNotes 模板分享

    画了一个A4纸模板,分享出来: 模板下载 原始PSD下载

  6. 树莓派3B+红外配置

    sudo apt-get install lirc /etc/lirc/lirc_options.conf #driver = devinput driver = default #device = ...

  7. linux 实时监控网速脚本(转)

    #!/bin/bash ethn=$ while true do RX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{pri ...

  8. NodeJS包管理器之Yarn

    一.安装yarn 首选必须先安装好NodeJS,之后可以去yarn官网下载mis安装程序安装.由于NodeJS自带了一个包管理器npm,所以安装yarn更简单的方法是直接使用npm install - ...

  9. [原]globalmapper设置高程配色(globalmapper自定义配色方案)

    1.使用的globalmapper版本:1.8以上(之前的版本也应该支持) 2.将全球DEM加载进去 (零时找的小DEM  全球7级) 3.右击此处,选择“高程图例选项” 4.选择 配置-着色器选项 ...

  10. Python3基础 None 使用is来判断

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...