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. Windows Host 文件

    Windows XP Home / Windows 7/ Windows Server 2008 c:\windows\system32\drivers\etc\hosts 如果碰到Localhost ...

  2. 永恒之蓝EternalBlue复现

    0x01 漏洞原理:http://blogs.360.cn/blog/nsa-eternalblue-smb/ 目前已知受影响的 Windows 版本包括但不限于:Windows NT,Windows ...

  3. C++ new new[]详解

    精髓: operator new()完成的操作一般只是分配内存:而构造函数的调用(如果需要)是在new运算符中完成的. operator new和new 运算符是不同的,operator new只分配 ...

  4. MySQL入门很简单: 8查询数据

    1. 查询语句语法 SELECT 属性列表 FROM 表名和视图列表 [WHERE 条件表达式1] [GROUP BY 属性名1 [HAVING t条件表达式2]] [ORDER BY 属性名2 [A ...

  5. php session小节

    1.为什么要用session? 在人们访问网站的时候,有很多个网页,由于http自身的特点,用户每执行一个脚本都需要和web服务器重新建立连接.由于他们之间是无状态的,这次的连接无法得到上次连接的状态 ...

  6. maven项目右键快捷方式,然后点击Run As

    在某一个maven项目右键快捷方式,然后点击Run As就可以发现几个Maven的命令: 1.Maven Build: 这个命令用于编译Maven工程,执行命令后会在target文件夹中的classe ...

  7. Responsive设计 (响应式设计)

    一.什么是响应式设计 维基百科是这样对响应式作的描述:“Responsive设计简单的称为RWD,是精心提供各种设备都能浏览网页的一种设计方法,RWD能让你的网页在不同的设备中展现不同的设计风格.” ...

  8. Notepad++插件Emmet和Python Script的安装

    最近在做一个项目,涉及到大量的HTML.CSS代码的编写,手动写代码效率实在 是低下.于是想搜索一下,有没有Notepad++插件可以支持自动生成的,果不其然还真有.Emmet,这款神器其实就是 Ze ...

  9. SAP标准导出功能 - 删除默认选定格式

    我们经常会使用SAP系统的标准功能导出ALV显示的数据,一般会选择电子表格. 选择电子表格之后,需要选择电子表格的具体格式. 选择格式之后点击确定,会弹出保存对话框. 如果在使用这个功能的时候,选择了 ...

  10. C#进阶学习笔记(个人整理)

    学习笔记 第一章: 一.回顾数组 1.变量 : 只能存储一个数据 2.数组 :存储固定大小的相同类型的数据 3.对象 : 存储多个相同/不同类型的数据 4.集合 : 特殊的容器,存储N个相同/不同类型 ...