数据结构篇(2) ts实现单链表
interface NodeItem {
    prev: NodeItem | null
    next: NodeItem | null
    data: any
}
class NodeItem {
    prev: NodeItem | null = null
    next: NodeItem | null = null
    constructor(data: any) {
        this.data = data ? data : null;
    }
}
interface ListNode {
    head: any
    size: number
    currentNode: NodeItem | null
    find(item:any):NodeItem | null  // 在单链表中寻找item元素
    insert(element:any,item:any):void  // 向单链表中插入元素
    remove(item:any):void // 在单链表中删除一个节点
    append(element:any):void // 在单链表的尾部添加元素
    findLast():NodeItem  // 获取单链表的最后一个节点
    isEmpty():boolean // 判断单链表是否为空
    show():void  // 显示当前节点
    getLength():number  // 获取单链表的长度
    advance(n:number, currNode:NodeItem):void  // 从当前节点向前移动n个位置
    display():void // 单链表的遍历显示
    clear():void  // 清空单链表
}
class ListNode {
    head: any = null
    size: number = 0
    currentNode: NodeItem | null = null
    constructor() {
        this.head = new NodeItem('head');
    }
    find(item:any):NodeItem | null {
        let currNode = this.head;
        while(currNode) {
            if(currNode.data === item) {
                return currNode;
            }
            currNode = currNode.next;
        }
        return null;
    }
    insert(element:any,item:any):any {
        if(!this.find(element)) {
            return;
        }
        let prevNode = this.find(element);
        if(prevNode == null) {
            return ;
        }
        let currNode = new NodeItem(item);
        currNode.next = prevNode.next;
        prevNode.next = currNode;
        this.size++;
    }
    remove(item:any):void {
        if(!this.find(item)) {
            return ;
        }
        if(item === 'head') {
            if(!this.isEmpty()) {
                return ;
            } else {
                this.head.next = null;
                return;
            }
        }
        let currNode = this.head;
        while(currNode) {
            if(currNode&&currNode.next.data === item) {
                break;
            }
            currNode = currNode.next;
        }
        currNode.next = currNode.next.next;
        this.size--;
    }
    append(element:any):void {
        let rear = this.findLast();
        let currentNode = new NodeItem(element);
        rear.next = currentNode;
        this.size++;
    }
    findLast():NodeItem {
        let currNode:NodeItem = this.head;
        while(currNode.next) {
            currNode = currNode.next;
        }
        return currNode;
    }
    isEmpty():boolean {
        if(this.head.next) {
            return true;
        }
        return false;
    }
    show():void {
        console.log(this.currentNode?.data);
    }
    getLength():number {
        let i = 0;
        let currNode = this.head;
        while(currNode) {
            i++;
            currNode = currNode.next;
        }
        return i;
    }
    advance(n:number, currNode:NodeItem = this.head):NodeItem {
        this.currentNode = currNode;
        while((n--)&&this.currentNode.next) {
            this.currentNode = this.currentNode?.next;
        }
        return this.currentNode;
    }
    display():void {
        let currentNode = this.head;
        while(currentNode) {
            console.log(currentNode.data);
            currentNode = currentNode.next;
        }
    }
    clear():void {
        this.head.next = null;
        this.size = 0;
    }
}
let myList = new ListNode();
let arr = [3, 4, 5, 6, 7, 8, 9];
for(let i=0; i<arr.length; i++){
    myList.append(arr[i]);
}
myList.insert(3,2);
myList.display();
												
											数据结构篇(2) ts实现单链表的更多相关文章
- 数据结构篇(2) ts实现单循环链表
		
JS的class可以通过extends关键字实现类似其他语言的继承效果,比起使用一个extends关键字,在es5中实现继承要复杂一些,可以通过修改原型链的方法实现继承,让一个原型对象等于另一个类型的 ...
 - 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t
		
nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...
 - 菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
		
菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog. ...
 - 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]
		
菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
 - 菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t[转]
		
菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
 - 数据结构篇(3)ts 实现双向链表
		
如今终于到了双向链表了,此前在Node结构中的prev指针终于派上了用场.由于双向链表多了一个前向指针,所以有些操作和单向链表比较起来反而更加的简单. class DbList extends Cir ...
 - 数据结构篇(1) ts实现栈的基本操作和解决相关问题
		
interface Stack { _items: any push(element: any): void pop(): any top(): any size(): any isEmpty(): ...
 - 图解Redis之数据结构篇——链表
		
前言 Redis链表为双向无环链表! 图解Redis之数据结构篇--简单动态字符串SDS提到Redis使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构 ...
 - C语言实现的单链表
		
链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来. 单链表的基本实现: typedef int DataType;//定义单链表typedef ...
 
随机推荐
- Python的类和继承
			
一.类的封装: 封装将类的信息隐藏在类内部,不允许外部直接修改该类的变量,只能通过该类提供的方法来实现对隐藏信息的操作和访问 class Boss(): # 类的公共属性 level=1 # 类的初始 ...
 - class文件和java文件区别
 - spring cloud 和dubbo区别?
			
1.服务调用方式 dubbo是RPC springcloud Rest Api2.注册中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper3.服务网 ...
 - 使用Spring通过什么方式访问Hibernate?
			
在Spring中有两种方式访问Hibernate: 控制反转 Hibernate Template和 Callback. 继承 HibernateDAOSupport提供一个AOP 拦截器.
 - Mybatis有哪些执行器?
			
Mybatis有三种基本的Executor执行器: SimpleExecutor.ReuseExecutor.BatchExecutor. SimpleExecutor:每执行一次 ...
 - springboot使用策略模式实现一个基本的促销
			
策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户 源码:https://github.com/youxiu326/sb_promotion.git ...
 - redis持久存储RDB和AOF的区别及优缺点
			
1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...
 - C++ - main()和_tmain(int argc, _TCHAR* argv[]) 的详细区别
			
一些程序中会发现主函数不是int main(),而是int _tmain(),而且头文件也不是<iostream>而是<stdafx.h>. 首先,这个_tmain()是为了支 ...
 - 浅谈ES6中的Async函数
			
转载地址:https://www.cnblogs.com/sghy/p/7987640.html 定义:Async函数是一个异步操作函数,本质上,Async函数是Generator函数的语法糖.asy ...
 - es6语法之模版字符串
			
//es6语法之`${}`以及vue语法 `${ }` (模版字符串)const name = '小缘' const age = 14 console.info(`大家好,我叫${name},今年${ ...