ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构篇(3)ts 实现双向链表

2022-03-29 13:31:06  阅读:213  来源: 互联网

标签:数据结构 lastNode currNode ts next 链表 newNode prev 节点


如今终于到了双向链表了,此前在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();

标签:数据结构,lastNode,currNode,ts,next,链表,newNode,prev,节点
来源: https://www.cnblogs.com/guozhiqiang/p/16071250.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有