使用JavaScript封装一个链表(面试题)

    <script>
        class Node {
            constructor(item) {
                this.item = item;
                this.next = null;
            }
        }
        class LinkedList {
            constructor() {
                // 链头
                this.head = null
                // 计数
                this.count = 0
            }
            // push追加
            push(item) {
                let node = new Node(item)
                if (this.head === null) {
                    this.head = node
                } else {
                    // 不能随意动我们的链头,所以把他赋值给current
                    let current = this.head
                    // 循环找每个node的next是否为null
                    while (current.next !== null) {
                        current = current.next
                    }
                    current.next = node
                }
                this.count++
            }

            // 从指定位置删除
            // removeAt(index) {
            //     if (index >= 0 && index <= this.count) {
            //         let current = this.head
            //         if (index === 0) {
            //             // 当删除的是链头的时候,吧链头下一个作为链头即可
            //             this.head = this.head.next
            //             this.count--
            //         } else {
            //             let prev
            //             for (let i = 0; i < index; i++) {
            //                 prev = current
            //                 current = current.next
            //             }
            //             prev.next = current.next
            //         }
            //         this.count--
            //         return current.item
            //     }
            //     return
            // }

            // 获取位置
            getNodeAt(index) {
                if (index >= 0 && index < this.count) {
                    let node = this.head
                    for (let i = 0; i < index; i++) {
                        node = node.next
                    }
                    return node
                }
                return
            }
            // 从指定位置删除
            removeAt(index) {
                if (index >= 0 && index <= this.count) {
                    let current = this.head
                    if (index === 0) {
                        // 当删除的是链头的时候,吧链头下一个作为链头即可
                        this.head = this.head.next
                        this.count--
                    } else {
                        let prev = this.getNodeAt(index - 1)
                        current = prev.next
                        prev.next = current.next
                    }
                    this.count--
                    return current.item
                }
                return
            }

            // 按照传入数值删除
            /*
              1.封装一个通过数据返回索引的方法
              2.判断两个参数是否相等
              3.在直接调用从指定位置删除的removeAt()方法
            */

            // 通过数值返回索引方法
            indexOf(item) {
                let current = this.head
                for (let i = 0; i < this.count; i++) {
                    // 如果当前元素等于传入的item元素值,就return他的索引
                    if (this.enqual(current.item, item)) {
                        return i
                    }
                    // 从链头到链尾
                    current = current.next
                }
            }
            // 判断两个元素是否相等
            enqual(a, b) {
                return JSON.stringify(a) === JSON.stringify(b)      // 返回的是一个布尔值
            }

            // 按照remove()删除,调用removeAt()
            remove(item) {
                let index = this.indexOf(item)
                return this.removeAt(index)
            }


        }
        let list = new LinkedList()

    </script>

这里就是全部内容咯~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值