数据结构之链表的js实现

一、链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点组成,
对于链表来说删除或添加一个元素是非常方便的,除了数据的随机访问(可以实现但是比较麻烦,比如可以通过添加和操作索引值来实现),它几乎可以用在任何可以使用一维数组的情况中

单向链表:每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
双向链表:每一个节点包含三个:指向上一个节点的地址、内容、指向下一个节点的地址。被称为:直接后继和直接前驱。头节点没有直接前驱、尾节点没有直接后继。
循环链表:和双向列表一样,头节点的前继指向尾节点,尾节点的后驱指向头节点。

链表的实现:类似于嵌套,将下一个内容的对象赋值给this.next()

通过一个类实现链表节点:

class Node {
    constructor(data) {
        this.data = data;  // 节点的数据
        this.prev = null;  // 节点的前项
        this.next = null;  // 节点的后项
    }
}

定义链表:(最好将方法定义在链表的原型对象上)

class SingleList {
            constructor() {
                this.size = 0;  // 单链表的长度
                this.head = new Node('head');  // 表头节点
                this.currNode = '';  // 当前节点的指向
            }
           
        }
        
        实现 find(item) { }  // 在单链表中寻找item元素
            insert(item, element) { }  // 向单链表中插入元素
            remove(item) { }  // 在单链表中删除一个节点
            append(element) { }  // 在单链表的尾部添加元素
            findLast() { }  // 获取单链表的最后一个节点
            isEmpty() { }  // 判断单链表是否为空
            show() { }  // 显示当前节点
            getLength() { }  // 获取单链表的长度
            advance(n, currNode) { }  // 从当前节点向前移动n个位置
            display() { }  // 单链表的遍历显示
            clear() { }  // 清空单链表

实现了这些方法后,就形成了链表数据结构的大概框架了。

插入方法:

   SingleList.prototype = {
            find: function (item) { // 在单链表中寻找item元素
                //将头节点取出来,冲头节点开始遍历
                var currNode = this.head;
                //当currNode为空或者找到这个值的时候就停止返回
                while (currNode.data != item) {
                    //递归遍历
                    currNode = currNode.next
                }
                //返回为找到的值或者为空
                return currNode
            },
            findPrevious: function (item) {//寻找某节点的前一个节点
                var currNode = this.head;
                // 循环遍历,知道某节点的下一个节点内容相等
                while (currNode.next != ittem) {
                    currNode = currNode.next
                }
                return currNode
            },
            insert: function (item, element) {// 向element单链表中插入元素
                //定义一个新节点
                var newNode = new Node(item)
                //找到要插入的节点位置
                var current = this.find(element)
                //进行节点的改变,插入
                newNode.next = current.next
                current.next = newNode
            },
            remove: function (item) {// 在单链表中删除一个节点
                //寻找某个节点的前一个节点,将next移除
                var preNode = this.findPrevious(item)
                if (preNode.next != null) {
                    preNode.next = preNode.next.next
                }
            },
            display: function () { //打印所有元素
                var currNode = this.head
                while (currNode.next != null) {
                    console.log(currNode.next.data);
                    currNode = currNode.next
                }
            }
}

 

posted @   铜须的编程生活  阅读(381)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示