JavaScript 数据结构-单向链表

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style></style>
</head>

<body>

    <script>
        // 封装单向链表类
        function linkedList() {
            // 内部的类:用来表示每一个节点(数据,指针)
            function Node(data) {
                this.data = data //节点数据
                this.next = null //节点指针
            }

            // 属性
            this.head = null // 头指针
            this.length = 0 // 链表长度

            // 1.末尾追加方法
            linkedList.prototype.append = function (data) {
                // 1.创建新的节点
                var newNode = new Node(data)

                // 2.判断添加的是否为第一个节点
                if (this.length == 0) { //2.1是第一个节点
                    this.head = newNode
                } else { //2.2不是第一个节点
                    // 找到最后一个节点
                    var current = this.head //当前节点为头指针
                    while (current.next) {
                        current = current.next //循环,让当前节点指向下一个节点
                    }
                    // 此时的current表示最后一个节点 最后节点的next指向新的节点
                    current.next = newNode //修改最后节点的指针指向
                }

                // 3.length+1
                this.length += 1
            }

            // 2.toString方法
            linkedList.prototype.toString = function () {
                // 1.定义变量
                var current = this.head
                var listString = ''

                // 2.循环获取每一个节点
                while (current) {
                    listString += current.data + ' '
                    current = current.next
                }
                return listString
            }

            // 3.插入方法
            linkedList.prototype.insert = function (position, data) {
                // 1.判断插入的位置position是否越界
                if (position < 0 || position > this.length) {
                    return false
                }

                // 2.创建新的节点
                var newNode = new Node(data)

                // 3.判断插入位置是否是第一个
                if (position == 0) {
                    newNode.next = this.head //改变新插入节点的指针 指向原来的第一个节点
                    this.head = newNode //头指针指向新插入的节点
                } else {
                    var index = 0 //用于记录当前位置
                    var current = this.head //用于表示当前节点
                    var previous = null //用于表示上一个节点
                    while (index++ < position) { //当前位置小于插入位置就继续循环
                        previous = current //上一个节点等于当前节点
                        current = current.next //当前节点等于当前节点的下一个节点
                    }

                    newNode.next = current //循环结束,已经找到插入节点位置,插入节点的下一个节点等于当前节点
                    previous.next = newNode //上一个节点指针指向新插入的节点
                }

                // 4.长度+1
                this.length += 1
            }

            // 4.获取元素方法
            linkedList.prototype.get = function (position) {
                // 1.判断是否越界
                if (position < 0 || position >= this.length) {
                    return false
                }

                // 2.获取对应的data
                var current = this.head
                var index = 0
                while (index++ < position) { // index=0 每循环一次+1
                    current = current.next
                }

                // 此时的current就是position位置的节点
                return current.data
            }

            // 5.获取元素下标的方法
            linkedList.prototype.indexOf = function (data) {
                // 1.定义变量
                var current = this.head //用于保存当前节点 ,初始化为头结点
                var index = 0 //记录下标

                // 2.开始查找
                while (current) { //当current为null时结束循环
                    if (current.data == data) {
                        return index
                    }
                    current = current.next //一个一个节点查找
                    index += 1 //循环一次,下标+1
                }

                // 3.没有找到current,也就是current=null 返回-1
                return -1
            }

            // 6.更改某个下标的元素
            linkedList.prototype.update = function (position, newData) {
                // 1.判断是否越界
                if (position < 0 || position >= this.length) {
                    return false
                }

                // 2.定义变量
                var current = this.head
                var index = 0

                // 3.查找正确的节点
                while (index++ < position) {
                    current = current.next
                }

                //4.将position位置节点的data修改为newData
                current.data = newData
            }

            // 7.删除下标元素
            linkedList.prototype.removeAt = function (position) {
                // 1.判断是否越界
                if (position < 0 || position >= this.length) {
                    return false
                }

                // 2.定义变量
                var current = this.head
                var index = 0
                var previous = null

                // 3.判断是否删除的是第一个节点
                if (position == 0) {
                    this.head = this.head.next
                } else {
                    while (index++ < position) {
                        previous = current
                        current = current.next
                    }

                    // 4.前一个节点的next 指向,current的next
                    previous.next = current.next
                }

                // 5.长度-1
                this.length -= 1
                return current.data //返回删除元素
            }

            // 8.删除元素
            linkedList.prototype.remove = function (data) {
                // 1.获取data在链表中的位置
                var position = this.indexOf(data)

                // 2.根据位置信息,删除节点
                return this.removeAt(position)
            }

            // 9.判断是否为空链表
            linkedList.prototype.isEmpty = function () {
                return this.length == 0
            }

            // 10.获取链表长度的方法
            linkedList.prototype.size = function () {
                return this.length
            }
        }


        // 测试
        // 1.创建linkedList
        var list = new linkedList()

        // 2.测试末尾追加方法
        list.append(10)
        list.append(20)
        list.append(30)
        alert(list)

        // 3.测试插入方法
        list.insert(3, 40)
        list.insert(0, 1)
        list.insert(1, 2)
        alert(list)

        // 4.测试获取元素方法
        alert(list.get(0))
        alert(list.get(1))
        alert(list.get(2))

        // 5.测试获取下标方法
        alert(list.indexOf(1))
        alert(list.indexOf(2))
        alert(list.indexOf(3))

        // 6.测试更改下标元素的方法
        list.update(0, '更改的1号元素')
        list.update(1, '更改的2号元素')
        list.update(2, '更改的3号元素')
        alert(list)

        // 7.测试根据下标删除元素的方法
        list.removeAt(0)
        list.removeAt(0)
        list.removeAt(0)
        alert(list)

        // 8.测试根据元素删除元素的方法
        list.remove(20)
        alert(list)
        list.remove(30)
        alert(list)

        // 9.测试是否为空链表的方法
        alert(list.isEmpty())

        // 10.测试获取链表长度的方法
        alert(list.size())
    </script>
</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值