2014.06.14 20:17

简介:

  双向链表是LRU Cache中要用到的基本结构,每个链表节点左右分别指向上一个和下一个节点,能够自由地左右遍历。

图示:

  

实现:

 // My implementation for doubly linked list.
struct ListNode {
int val;
ListNode *prev;
ListNode *next;
ListNode(int _val = ): val(_val), next(nullptr), prev(nullptr) {};
}; class DoublyLinkedList {
public:
DoublyLinkedList() {
m_size = ;
m_head = nullptr;
m_tail = nullptr;
} void insertFront(int val) {
if (m_size == ) {
m_head = m_tail = new ListNode(val);
} else {
ListNode *ptr = new ListNode(val);
ptr->next = m_head;
m_head->prev = ptr;
m_head = ptr;
}
++m_size;
} void insertBack(int val) {
if (m_size == ) {
m_head = m_tail = new ListNode(val);
} else {
m_tail->next = new ListNode(val);
m_tail->next->prev = m_tail;
m_tail = m_tail->next;
}
++m_size;
} void insertNode(int pos, int val) {
int i; if (i <= ) {
insertFront(val);
} else if (i >= m_size) {
insertBack(val);
} else {
ListNode *ptr1, *ptr2; ptr1 = m_head;
for (i = ; i < pos - ; ++i) {
ptr1 = ptr1->next;
}
ptr2 = new ListNode(val);
ptr2->next = ptr1->next;
ptr1->next->prev = ptr2;
ptr1->next = ptr2;
ptr2->prev = ptr1;
++m_size;
}
} void deleteNode(int pos) {
if (pos < || pos > m_size - ) {
return;
} ListNode *ptr1, *ptr2;
if (pos == ) {
ptr1 = m_head;
if (m_size == ) {
m_head = m_tail = nullptr;
} else {
m_head = m_head->next;
m_head->prev = nullptr;
}
delete ptr1;
} else {
ptr1 = m_head;
for (int i = ; i < pos - ; ++i) {
ptr1 = ptr1->next;
}
ptr2 = ptr1->next;
ptr1->next = ptr2->next;
if (ptr2->next == nullptr) {
m_tail = ptr1;
} else {
ptr2->next->prev = ptr1;
}
delete ptr2;
}
--m_size;
} void updateNode(int pos, int val) {
if (pos < || pos > m_size - ) {
return;
} ListNode *ptr = m_head;
for (int i = ; i < pos; ++i) {
ptr = ptr->next;
}
ptr->val = val;
} ListNode *findNode(int val) {
ListNode *ptr = m_head;
while (ptr != nullptr) {
if (ptr->val == val) {
return ptr;
}
ptr = ptr->next;
} return nullptr;
} ~DoublyLinkedList() {
ListNode *ptr = m_head;
while (m_head != nullptr) {
m_head = m_head->next;
delete ptr;
ptr = m_head;
}
m_head = m_tail = nullptr;
}
private:
int m_size;
ListNode *m_head;
ListNode *m_tail;
}; int main()
{
return ;
}

《数据结构与算法分析:C语言描述》复习——第三章“线性表、栈和队列”——双向链表的更多相关文章

  1. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  2. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  3. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  4. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  5. 《数据结构与算法分析-Java语言描述》 分享下载

    书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...

  6. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  7. 读书笔记:《数据结构与算法分析Java语言描述》

    目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...

  8. 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)

    上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...

  9. 《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)

    这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的 ...

随机推荐

  1. Django基础--4

    补充知识-路由系统(URL) URL传递额外的参数 在url.py里,除了默认会传一个request给处理函数,还可以传递额外的参数,把一个字典作为第三个参数传入,之后就可以在处理函数里取到对应的值: ...

  2. 笨办法学Python(十二)

    习题 12:提示别人 当你键入 raw_input() 的时候,你需要键入 ( 和 ) 也就是“括号(parenthesis)”.这和你格式化输出两个以上变量时的情况有点类似,比如说 "%s ...

  3. for循环研究

    for循环和递归是算法设计的重要结构之一: 两者具有相同的设计准则: 1.范围:开始和结束条件: 2.步增条件: 两者都用来处理顺序数据结构和计数计算: 递归也用于分而治之: for循环用于线性扫描: ...

  4. OpenGL进阶演示样例1——动态画线(虚线、实线、颜色、速度等)

            用OpenGL动态绘制线段.事实上非常easy,但到如今为止.网上可參考资料并不多. 于是亲自己主动手写一个函数,方便动态绘制线段.代码例如以下: #include<GL/glu ...

  5. 2017.10.25 Java List /ArrayList 三种遍历方法

    java list三种遍历方法性能比较 学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入记录,然后遍历ArrayList,测试代码如下: pac ...

  6. 2017.10.15 解析Java中抽象类和接口的区别

    (1)在Java语言中,abstract class 和interface 是支持抽象类定义的两种机制. 正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和 ...

  7. 谷歌浏览器兼容IE插件

    谷歌浏览器兼容IE插件 http://pan.baidu.com/s/1i31hspf

  8. 改变shape solid color

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  9. CI的子目录控制器问题

    不管是根目录还是子目录里面的文件名必须是首字母大写,否则会报404

  10. 【赛时总结】 ◇赛时·III◇ AtCoder ABC-099

    ◆赛时·III◆ ABC-099 ■唠叨■ 不要问我为什么先给ABC-100写了博客再写的ABC-099-- 莫名觉得这次比赛特别简单--虽然我并没有参加比赛,只是之后再补做的.QwQ ■试题& ...