单向链表结构以及其他常用方法的封装(JavaScript)

class LinkedList {
    constructor() {
        //内部的类:节点类
        class Node {
            constructor(data) {
                this.data = data;
                this.next = null;
            }
        }
        //属性
        this.head = null;
        this.length = 0;

        //链表的长度不包括头节点head,head指向的第一个节点的下标是0

        // 1.append(element)方法:在链表末尾添加新元素
        LinkedList.prototype.append = function (data) {
            // 创建一个新节点
            var newNode = new Node(data);
            //存放head的指向值
            var current = this.head;
            //判断添加的是否是第一个节点
            if (this.length == 0) {
                this.head = newNode
            }
            else {
                // 从头开始查找直到链表末尾
                while (current.next) {
                    current = current.next
                }
                current.next = newNode
            }
            this.length += 1
        }

        // 2.toString()方法:将链表中的data转换成字符串形式
        LinkedList.prototype.toString = function () {
            //存放head的指向值
            var current = this.head;
            var listString = ""
            //循环获取一个个节点
            while (current) {
                listString += current.data + " ";
                current = current.next
            }
            return listString
        }

        // 3.insert(position,element)方法:在指定位置插入元素
        LinkedList.prototype.insert = function (position, data) {
            // 创建一个新节点
            var newNode = new Node(data);
            //存放head的指向值
            var current = this.head;
            // 创建一个当前节点的上一个节点
            var previous = null;
            // 首先对position进行越界判断
            if (position < 0 || position > this.length) {
                return false;
            }
            if (position == 0) {
                // head实际上是一个指针,指向第一个节点,相当于newNode取代了head
                newNode.next = this.head;
                this.head = newNode;
            } else {

                for (var i = 0; i < position; i++) {
                    // 插入位置的前一个节点
                    previous = current;
                    // 插入位置的后一个节点
                    current = current.next
                }
                newNode.next = current;
                previous.next = newNode
            }
            this.length += 1;
            return true
        }
        
        // 4.get(position)方法:获取元素
        LinkedList.prototype.get = function (position) {
            //存放head的指向值
            var current = this.head;
            // 首先进行越界判断
            if (position < 0 || position >= this.length) {
                return false;
            }
            //循环寻找到对应位置的元素
            for (var i = 0; i < position; i++) {
                current = current.next
            }
            return current.data
        }

        // 5.indexOf(element)方法:返回元素对应的索引值,如果找不到就返回-1
        LinkedList.prototype.indexOf = function (data) {
            //存放head的指向值
            var current = this.head;
            var index = 0;
            while (current) {
                if (current.data == data) {
                    return index;
                }
                index++;
                current = current.next
            }
            return -1;
        }

        // 6.update(position,element)方法:将position位置的元素修改成element
        LinkedList.prototype.update = function (position, data) {
            //存放head的指向值
            var current = this.head;
            if (position < 0 || position >= this.length) {
                return false
            }
            for (var i = 0; i < position; i++) {
                current = current.next;
            }
            current.data = data;
            return true
        }

        // 7.removeAt(position)方法:删除指定位置的元素
        LinkedList.prototype.removeAt = function (position) {
            //存放head的指向值
            var current = this.head;
            // 创建一个当前节点的上一个节点
            var previous = null;
            if (position < 0 || position >= this.length) return false;
            //判断删除的是否是第一个节点
            if (position == 0) {
                this.head = this.head.next;
            }
            else {
                for (var i = 0; i < position; i++) {
                    previous = current;
                    current = current.next
                }
                //    上一个节点的指针也要改变
                previous.next = current.next
            }
            this.length -= 1;
            return true
        }

        // 8.remove(element)方法:从链表中删除element项
        LinkedList.prototype.remove = function (data) {
            var position = this.indexOf(data);
            this.removeAt(position);
            return true
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值