其他分享
首页 > 其他分享> > 数据结构篇(3)ts 实现双向链表

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

作者:互联网

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