前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现单向链表、队列

实现单向链表、队列

作者头像
用户3258338
发布2021-01-28 15:29:33
4460
发布2021-01-28 15:29:33
举报

链表的实现

不同的数据结构适合不同的业务需求,有时候数组不能满足我们的性能要求,比如数组的塌陷问题,在工作过程中就有可能需要用到链表,今天我们一起实现一个(单向)链表。

?需要有基本的增删改查的功能:add、remove、set、get、revert

// 链表的节点类
class Node{
    constructor(ele,next){
        this.element = ele;
        this.next = next;
    }
}
class LinkedList{
    constructor(){
        this.head = null;
        this.size = 0;
    }
    // 私有属性、获取下标为index的节点
    _node(index){ 
        let cur = this.head;
        for(let i=0;i<index;i++){
            cur = cur.next;
        }
        return cur;
    }
    add(index,ele){ // 增
        if(typeof ele == 'undefined'){
            ele = index;
            index = this.size;
        }
        if(this.size === 0){
            let node = new Node(ele,null);
            this.head = node;
        }else{
            let preNode = this._node(index-1); // 前一位的值
            let node = new Node(ele,preNode.next);
            preNode.next = node;
        }
        this.size++;
    }
    remove(index){ // 删
        let removeNode;
        if(index == 0){
            removeNode = this.head;
            this.head = this.head.next;
        }else{
            let pre = this._node(index-1);
            removeNode = pre.next;
            pre.next = pre.next.next;
        }
        
        this.size--;
        return removeNode;
    }
    set(index,ele){ // 改
        let node = this._node(index);
        node.element = ele;
        return node;
    }
    get(index){ // 查
        return this._node(index);
    }
    revert(){
        function reverse(head){
            if(head == null || head.next == null){
                return head;
            }
            let newHead= reverse(head.next);
            head.next.next = head;
            head.next = null;
            return newHead;
        }
        this.head = reverse(this.head);
        return this.head;
    }
}


let linkedList = new LinkedList();
linkedList.add(0);
linkedList.add(2);
linkedList.add(1,1);
linkedList.add(3);
linkedList.add(4);
linkedList.add(5);
console.dir(linkedList,{depth:1000});
linkedList.remove(2);
console.dir(linkedList,{depth:1000});
linkedList.add(2,2);
console.dir(linkedList,{depth:1000});
linkedList.set(0,99);
console.dir(linkedList,{depth:1000});
module.exports = LinkedList;

链表的结构如图:

反转的结果:

基于链表实现队列

不队列的特点:先进先出

?只有入队和出队的功能:add、offer

const LinkedList = require('./Linkedlist');
class Queue{
    constructor(){
        this.linkedList = new LinkedList();
    }
    add(ele){
        this.linkedList.add(ele);
    }
    offer(){
        this.linkedList.remove(0);
    }
}

let queue = new Queue();
queue.add(1);
queue.add(2);
queue.add(3);
console.dir(queue,{depth:1000})
queue.offer();
console.dir(queue,{depth:1000})

两次console结果如图


逆水行舟,不进则退!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 女程序员的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 链表的实现
  • 链表的结构如图:
  • 基于链表实现队列
  • 两次console结果如图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档