如今终于到了双向链表了,此前在Node结构中的prev指针终于派上了用场。由于双向链表多了一个前向指针,所以有些操作和单向链表比较起来反而更加的简单。

class DbList extends CirListNode {
constructor() {
super();
}
/**
*
* @param item 插入的位置
* @param element 插入的值
* 1.插入的元素在中间的位置,一步将新节点的next指针指向插入节点的下一个节点,再将插入节点的下一个节点的prev指针指向新节点。第二步将插入节点的next指针指向新节点,再将新节点的prev指针指向插入节点就可以了。
* 2.插入节点的位置在末尾时比较简单,只要将最后一个节点的next指针指向新的节点,再将新节点的prev指针指向之前的最后一个节点即可。
*/
insert(item: any, element: any): void {
let currNode = this.find(item);
let newNode = new NodeItem(element);
if(currNode.next) {
newNode.next = currNode.next;
currNode.next.prev = newNode;
currNode.next = newNode;
newNode.prev = currNode;
} else {
currNode.next = newNode;
newNode.prev = currNode;
}
}
/**
*
* @param item //删除的元素
* 1. 删除的是头结点
* 2. 如果删除的是头结点默认清空链表
* 3. 如果的是中间位置,
*/
remove(item: any): void {
let currNode = this.find(item);
let lastNode = this.findLast();
//删除头结点即清空链表
if(item === 'head') {
this.head.next = null;
this.head.prev = null;
this.size = 0;
return ;
}
//当前节点存在
if(currNode&&currNode.prev&&currNode.next) {
//如果当前元素为最后一个节点
if(currNode === lastNode) {
currNode.prev.next = null;
} else {
currNode.prev.next = currNode.next;
currNode.next.prev = currNode.prev;
}
this.size--;
}
} //反向遍历
reverseDisplay() {
let lastNode = this.findLast();
let str = '';
while(lastNode.data != 'head'&&lastNode.prev) {
str+=lastNode.data+'=>';
lastNode = lastNode.prev;
}
console.log(str);
} //添加元素函数
append(element: any): void {
let newNode = new NodeItem(element);
let lastNode = this.findLast();
lastNode.next = newNode;
newNode.prev = lastNode;
this.size++;
}
} const arr:Array<number> = [1,2,3,4,5,6];
const myList2:DbList = new DbList();
for(let i = 0;i<arr.length;i++) {
myList2.append(arr[i]);
} myList2.remove(2);
myList2.reverseDisplay();

数据结构篇(3)ts 实现双向链表的更多相关文章

  1. 菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t[转]

    nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...

  2. 数据结构篇(2) ts实现单循环链表

    JS的class可以通过extends关键字实现类似其他语言的继承效果,比起使用一个extends关键字,在es5中实现继承要复杂一些,可以通过修改原型链的方法实现继承,让一个原型对象等于另一个类型的 ...

  3. 数据结构篇(2) ts实现单链表

    interface NodeItem { prev: NodeItem | null next: NodeItem | null data: any } class NodeItem { prev: ...

  4. 数据结构篇(1) ts实现栈的基本操作和解决相关问题

    interface Stack { _items: any push(element: any): void pop(): any top(): any size(): any isEmpty(): ...

  5. 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t

    nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...

  6. 图解Redis之数据结构篇——链表

    前言     Redis链表为双向无环链表!     图解Redis之数据结构篇--简单动态字符串SDS提到Redis使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构 ...

  7. 菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t

    菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  8. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t

    新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  9. 图解Redis之数据结构篇——简单动态字符串SDS

    图解Redis之数据结构篇--简单动态字符串SDS 前言     相信用过Redis的人都知道,Redis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用.这个对象系统包括字符串对象 ...

随机推荐

  1. Flutter入门教程(一)Flutter简介

    这是Flutter系列第一篇文章,后续会持续更新Flutter相关知识,本篇就主要对于Flutter技术做一个简单的入门介绍 一.Flutter简介 Flutter是谷歌的移动UI框架,可以快速在iO ...

  2. 由浅入深,带你用JavaScript实现响应式原理(Vue2、Vue3响应式原理)

    由浅入深,带你用JavaScript实现响应式原理 前言 为什么前端框架Vue能够做到响应式?当依赖数据发生变化时,会对页面进行自动更新,其原理还是在于对响应式数据的获取和设置进行了监听,一旦监听到数 ...

  3. linux下的shell脚本

    先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. 我写下来只是作为笔记,如果侵权,请留言,立马删除. Shell ...

  4. 如何在 spring 中启动注解装配?

    默认情况下,Spring 容器中未打开注解装配.因此,要使用基于注解装配,我们 必须通过配置 <context:annotation-config/> 元素在 Spring 配置文件 中启 ...

  5. springmvc组件组成以及springmvc的执行过程

    springmvc三大组件 处理器映射器:用户请求路径到Controller方法的映射 处理器适配器:根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同区寻找不同 ...

  6. 为什么要用Spring

    1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合.有了Spring,用户不必再为单实例模式类.属性文件解析 ...

  7. BMZCTF 2020祥云杯到点了

    2020祥云杯到点了 下载附件得到三个word文档,我们打开第一个文档然后将隐藏文字显示出来 得到提示 我们查看属性应该就是日期了我们先把他记录下来 然后打开第二个文档 输入刚刚的密码 在第二个wor ...

  8. 智能指针中C++重载'->'符号是怎么实现的

    例如下面的代码: class StrPtr{ public: StrPtr() : _ptr(nullptr){} //拷贝构造函数等省略... std::string* operator->( ...

  9. 决策树算法一:hunt算法,信息增益(ID3)

    决策树入门 决策树是分类算法中最重要的算法,重点 决策树算法在电信营业中怎么工作? 这个工人也是流失的,在外网转移比处虽然没有特征来判断,但是在此节点处流失率有三个分支概率更大 为什么叫决策树? 因为 ...

  10. MySQL索引机制(详细+原理+解析)

    MySQL索引机制 永远年轻,永远热泪盈眶 一.索引的类型与常见的操作 前缀索引 MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度.但是前缀索引也有它的坏处:MySQL 不能在 ORDER ...