《数据结构与算法分析:C语言描述》复习——第三章“线性表、栈和队列”——双向链表
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语言描述》复习——第三章“线性表、栈和队列”——双向链表的更多相关文章
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- 《数据结构与算法分析-Java语言描述》 分享下载
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
- 读书笔记:《数据结构与算法分析Java语言描述》
目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)
上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)
这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的 ...
随机推荐
- COGS 678. 双重回文数
★ 输入文件:dualpal.in 输出文件:dualpal.out 简单对比时间限制:1 s 内存限制:128 MB Dual Palindromes 双重回文数 描述 [USACO ...
- 初学React:JSX语法
这是本人初学React做的学习笔记;讲的不是很深,只算是简单的进行介绍. 这是一个小系列.都是在同一个模板中搭建的,但是代码是不能正常执行的. >>第一个组件.js 'use strick ...
- QT创建与调用Dll方法(包括类成员)--显式调用
看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说: 使用Qt编写模块化插件式应用程序 Qt 一步一步实现dll调用(附源码)---(这一篇里没 ...
- Android(java)学习笔记65:Clock App 编写报错02
1. 首先之间看错误: 07-13 10:07:55.354: E/AndroidRuntime(8008): FATAL EXCEPTION: main 07-13 10:07:55.354: E/ ...
- 在TextBox控件中禁用鼠标右键
实现效果: 知识运用: MouseEventArgs类的Button属性 TextBox控件的ContextMenu属性 实现代码: private void textBox1_MouseDo ...
- Linux查看CPU和内存使用情况[转]
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...
- Java常见加密技术的密钥与加密串长度
Java常见的Java方式 1.Base64编码 2.十六进制(Hex)编码 3.MD消息摘要 4.DES加密 5.3DES加密 6.AES加密 6.RSA加密
- 前端jQuery基本语法
1.概念 1.1基础知识 jQuery是一个兼容多浏览器的JavaScript库,封装了开发过程中常用的一些功能,类似Python模块 jQuery就是用JS写的,JS是基础 jQuery写起来简单, ...
- element el-tooltip 内容换行的方法
<el-tooltip class="item" effect="light" placement="top-start"> ...
- iOS 蓝牙(GameKit CoreBluetooth)
利用GameKit框架实现ios设备的蓝牙通讯,导入框架:#import <GameKit/GameKit.h> , 注意: 此框架只能用于ios设置间蓝牙通讯 如今苹果开放了接口来实现 ...