js 单项链表

介绍链表

链表是由一组节点组成的集合。每个节点都使用一个对象的引用指向它的后续借点。指向另一个借点的引用叫作链。
不少编程语言中数组的长度是固定的,就是定义数组的时候须要定义数组的长度,因此当数组已经被数据填满的时候,须要再加入新的元素就很困难。只能说在部分变成语言中会有这种状况,在javascript中和php中数组的长度是能够任意增长的。在数组中添加和删除元素也是比较麻烦,由于要将数组中其余元素向前或者向后平移,这个在javascript中也不是问题,javascript中有一个很方便的方法splice()方法很方便的就能够添加或删除元素。
可是凡是都是相对的,javascript中的数组也有本身的问题,他们被设计成了对象,与其余语言(好比c++和java)相比它的效率很低。
若是在实际的使用中发现数组的效率很慢,就能够考虑使用链表来代替。数组还有个优点是能够根据键值很方便的访问数组的值,除此以外,链表在任何场合均可以代替数组。若是须要随机地访问元素,数组仍然是更好的选择。javascript

代码实现

定义链表节点(Node)类
Node类包含两个属性,element用来保存节点上的数据,next用来保存指向下一个节点的连接php

class Node {
    constructor(element) {
        this.element = element;  // 表示节点上的数据
        this.next = null;   // 表示指向下一个节点的连接
    }
}
export default Node;

定义链表类(LinkedList)类
LinkedList类提供插入节点,删除节点,显示链表节点元素的方法,以及一些其余的辅助方法java

import Node from './Node';
/**
 * Linked List class
 */
class LinkedList {
    /**
     * 构造器,初始化头节点
     */
    constructor() {
        this.head = new Node('head');  // 节点头列表
    }

    /**
     * 根据指定值找出当前节点
     * 辅助方法
     * @param {*} item 
     */
    _find(item) {
        let currNode = this.head;
        while(currNode.element != item) {
            currNode = currNode.next;
        }
        return currNode;    
    }

    /**
     * 把新的节点插入到指定节点的后面
     * @param {*} newELement 插入的新节点
     * @param {*} item 插入元素的前一个节点值
     */
    insert(newELement, item) {
        let newNode = new Node(newELement);
        let currNode = this._find(item);
        newNode.next = currNode.next;
        currNode.next = newNode;
    }

    /**
     * 移除节点
     * @param {*} item 
     */
    remove(item) {   
        // 找出指定节点的前一个节点
        let prevNode = this.head;
        while(prevNode.next != null && prevNode.next.element != item) {
            prevNode = prevNode.next;
        }

        if (prevNode.next != null) {
            // 设置前一个节点next指向当前节点的next
            prevNode.next = prevNode.next.next;
        }
    }

    /**
     * 显示全部节点数据
     */
    display() {
        let currNode = this.head;
        while(currNode.next != null) {
            console.log(currNode.next.element);
            currNode = currNode.next;
        }
    }
}

export default LinkedList;

测试

import LinkedList from './LinkedList';

// 建立一个 LinkedList 实例
let ll = new LinkedList();

// 插入一些元素
ll.insert('zhangsan', 'head');
ll.insert('lisi', 'zhangsan');
ll.insert('wangwu', 'lisi');

ll.display();  // 显示元素,控制台输出 zhangsan,lisi,wangwu
ll.remove('lisi');
ll.display(); // 控制台输出 zhangsan,wangwu
相关文章
相关标签/搜索