如今终于到了双向链表了,此前在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. zookeeper从小白到精通

    目录 1.介绍 1.1概念 1.2特点 1.3主要的集群步骤 1.4数据结构 1.5应用场景 2.本地安装 2.1安装jdk 2.2下载安装 2.3配置文件修改 2.4启动服务端 2.5启动客户端 2 ...

  2. 数据库连接Database link?

    在一个用户下,可以获取到另外的用户下的表的数据,通常在跨数据库时使用. create database link link93 connect to scott identified by tiger ...

  3. Ajax的核心的对象是什么?

    Ajax的核心对象是XMLXMLHttpRequest 对象. XMLHttpRequest提供不重新加载页面的情况下更新网页,在页面加载后在客户端向服务器请求数据,在页面加载后在服务器端接受数据,在 ...

  4. C++各种输入

    https://blog.csdn.net/qq_29735775/article/details/81165882 1.cin 2.cin.get() 3.cin.getline() 4.getli ...

  5. 为什么要使用 rabbitmq?

    (1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能; (2)拥有持久化的机制,进程消息,队列中的信息也可以保存下来. (3)实现消费者和生产者之间的解耦. (4)对于高并发场景下,利用消息队 ...

  6. Python form...import...和import的区别(自己理解的)

    Python有两种导入包和模块的方式,区别如下 form...import... import 相对导包 导入不同包子模块 可以导入模块所需变量/函数/类   init文件的__all__特殊变量(模 ...

  7. Saltstack自动化扩容

    一. etcd服务的安装和使用 1.安装etcd应用: wget https://github.com/coreos/etcd/releases/download/v2.2.5/etcd-v2.2.5 ...

  8. 遇到问题之“postman报Unsupported Media Type: Content type 'text/plain;charset=UTF-8' not supported”

    postman报Unsupported Media Type: Content type 'text/plain;charset=UTF-8' not supported postman之所以报Uns ...

  9. 外部晶振的使用原因与内部RC振荡器的使用方法 _

    原因一 早些年,芯片的生产制作工艺也许还不能够将晶振做进芯片内部,但是现在可以了.这个问题主要还是实用性和成本决定的.   原因二 芯片和晶振的材料是不同的,芯片 (集成电路) 的材料是硅,而晶体则是 ...

  10. scanf()格式化输入

    scanf();有种带[]的格式化输出方式 此格式控制符的基本格式为:%[scanfset] #include<stdio.h> int main() { char str[100] ; ...