JavaScript数据结构与算法——链表

news/2024/7/1 20:11:17

1.链表数据结构

链表存储有序的元素集合,但不同于数组,链表中的元素咋内存中并不是连续放置的每个元素有一个存储元素本身的节点和一个指向下一个元素的引用组成。下图展示了一个链表的结构:
clipboard.png
链表的优点:
链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;

缺点:
因为含有大量的指针域,占用空间较大;
查找元素需要遍历链表来查找,非常耗时。

适用场景:
数据量较小,需要频繁增加,删除操作的场景

2.创建链表

function LinkedList() {
    // 创建一个node类,表示将要加入的项 element表示要添加的值,next指向列表中下一个节点项的指针
    let Node = function(element) {
        this.element = element;
        this.next = null;
    }
    let length = 0;
    let head = null;
    // 下面声明链表的方法
    // 1.向列表尾部添加一个新的项
    this.append = function(element) {
        let node = new Node(element);
            current;
        // 列表为空,添加的是第一个元素
        if(head === null) {
           head = node; 
        // 列表不为空,向其追加   
        } else {
           
            current = head;
            // 循环列表,直到找到最后一项
            while(current.next) {
                current = current.next;
            }
            // 找到最后一项,将其next赋为node,建立链接
            current.next = node;
        }
        // 更新列表长度
        length++;
    }
    // 2.从列表中移除元素
    this.removeAt = function(position) {
        // 检查position是否超出链表范围
        if(position > -1 && position < length) {
            let current = head,
                previous,
                index = 0;
            // 移除第一个元素
            if(position === 0 ) {
                head = current.next;
            } else {
                // 循环到指定位置,找到该位置的 previous和current
                while(index++ < position) {
                    previous = current;
                    current = current.next;
                }
                // 将previous与current的下一项链接起来:跳过current
                previous.next = current.next;
            }    
            // 链表长度减一
            length--;
            // 返回被删除项
            return current.element;
        } else {
            // 不是有效位置,返回null
            return null
        }
    }
     // 3.在任意位置插入元素
    this.insert = function(element, position) {
        //判断是否超过链表范围
        if (position >= 0 && position<= length) {
            let node = new Node(element),
                current = head,
                previous,
                index = 0;
            // 在首位插入元素
            if (position === 0 ) {
                node.next = current;
                head = node;
            } else{
                // x循环到position应该添加的位置,取出previous和current
                while(index++ < position) {
                    previous = current;
                    current = current.next;
                }
                // 在previous和current间插入
                node.next = current;
                previous.next = node;
            };    
            // 更新链表长度
            length++;
            return true;
        } else{
            return false;
        };
    }
    //4. 把LinkedList对象转化成字符串
    this.toString = function() {
        let current = head,
            string = '';
        while(current) {
            string += current.element + (current.next ? 'n' : '');
            current = current.next;
        }  
        return string;  
    }
    //5.链表中是否存在某个值
    this.indexOf = function(element) {
        let current = head,
            index = 0;
        while(current) {
            if(element === current.element) {
                return index;
            }
            index++;
            current = current.next;
        }  
        return -1; 
    } 
    //6.通过element实现remove元素
    this.remove = function(element) {
        let index = this.indexOf(element);
        return this.removeAt(index);
    }
    //7.isEmpty size getHead方法
    this.isEmpty = function() {
        return length === 0; 
    }
    this.size = function() {
        return length;
    }
    this.getHead = function() {
        return head;
    }    
}

http://www.niftyadmin.cn/n/4541437.html

相关文章

NLPIR大数据挖掘融合库、智、理三大先进理论技术

随着计算机技术的发展,各行各业都开始采用计算机及相应的信息技术进行管理和运营,这使得企业生成、收集、存贮和处理数据的能力大大提高,数据量与日俱增。企业数据实际上是企业的经验积累,当其积累到一定程度时,必然会反映出规律性的东西;所以对企业来说,这些堆积如山的数据无异…

python(leetcode)-1.两数之和

给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。示例:给定 nums [2, 7, 11, 15], target …

前端之HTML面试题集锦

由于最近要准备找实习工作&#xff0c;所以不得不海量搜集关于前端的各种面试题&#xff0c;今天先为大家奉献上小编所找到的前端之HTML相关面试题。 1.Doctype作用&#xff1f;严格模式与混杂模式如何区分&#xff1f;它们有何意义? Doctype可声明三种DTD类型&#xff0c;分…

运维监控-Zabbix Server 使用QQ SMTP发送邮件报警及定制报警内容

运维监控-Zabbix Server 使用QQ SMTP发送邮件报警及定制报警内容 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 本篇博客采用腾讯邮箱&#xff0c;想必大家都对QQ很了解&#xff0c;所以我就直接用QQ邮箱来发送数…

蓝桥学院2019算法题2.20

题5&#xff1a;设计一个高效的求a的n次幂的算法 算法分析&#xff1a; 1、可以用for循环实现 a*a*a*a*... 2、可以用递归实现 res*pow1(a,n-ex) 1 package recursion;2 3 /**4 * author zsh5 * company wlgzs6 * create 2019-02-18 16:307 * Describe 设计一个高效的求a的…

JS之预编译

今天有幸获得腾讯的电话面试&#xff0c;不幸的是面试非常惨&#xff0c;但是从中认识到自己的不足和找到日后该努力的方向&#xff0c;就拿面试中的关于js的预编译来说吧&#xff0c;小编都不知道是啥&#xff0c;面试完后赶紧查资料&#xff0c;写总结。 首先javascript是解…

elasticsearch查询语句总结

query 和 filter 的区别请看&#xff1a;https://www.cnblogs.com/bainianminguo/articles/10396956.html Filter DSL term 过滤 term主要用于精确匹配哪些值&#xff0c;比如数字&#xff0c;日期&#xff0c;布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)&#x…

java 8中map中compute,computeIfAbsent,computeIfPresent方法介绍

2019独角兽企业重金招聘Python工程师标准>>> compute&#xff08;计算&#xff09; default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) 指定的key值在map中的value值进行操作&#xff0c; 如果key存在&#xff0…