zoukankan      html  css  js  c++  java
  • 对链表的研究

    链表
    有点像⽕⻋,⻋厢和⻋厢之间链接,有点是可以随时替换⻋厢,react最新架构的fifiber,就是从树变成
    了链表,能够让diffff任务随时中断
    class Node{
    constructor(element){
    this.element = element
    this.next = null
    }
    }
    class LinkedList{
    constructor(){
    this.head = null
    this.current
    this.length = 0
    }
    append(element){
    const node = new Node(element)
    if (this.head === null) { // 插⼊第⼀个链表
    this.head = node
    } else {
    this.current = this.head
    while (this.current.next) { // 找到最后⼀个节点
    this.current = this.current.next
    }
    this.current.next = node
    }
    this.length++
    }
    // 移除指定位置元素
    removeAt(position) {
    if (position > -1 && position < this.length) {
    let previous
    let index = 0
    if (position === 0) { // 如果是第⼀个链表的话, 特殊对待
    this.head = this.head.next
    } else
    this.current = this.head
    while (index < position) { // 循环找到当前要删除元素的位置
    previous = this.current
    this.current = this.current.next
    index++
    }
    previous.next = this.current.next
    }
    this.length--
    }
    }
    // 在指定位置加⼊元素
    insert (position, element) {
    const node = new Node(element)
    let index = 0
    let current, previous
    if (position > -1 && position < this.length + 1) {
    if (position === 0) { // 在链表最前插⼊元素
    current = this.head
    this.head = node
    this.head.next = current
    } else {
    current = this.head
    while (index < position) { // 同 removeAt 逻辑, 找到⽬标位置
    previous = current
    current = current.next
    index++
    }
    previous.next = node // 在⽬标位置插⼊相应元素
    node.next = current
    }
    this.length++
    }
    }
    // 链表中是否含有某个元素, 如果有的话返回相应位置, ⽆的话返回 -1
    indexOf(element) {
    let index = 0
    this.current = this.head
    while (index < this.length) {
    if (this.current.element === element) {
    return index
    }
    this.current = this.current.next
    index++
    }
    return -1
    }
    // 移除某元素
    remove(element) {
    const position = this.indexOf(element)
    this.removeAt(position)
    }
    // 获取⼤⼩
    size () {
    return this.length
    }
    // 获取最开头的链表
    getHead () {
    return this.head
    }
    // 是否为空
    isEmpty () {
    return this.length === 0
    }
    // 打印链表元素
    log () {
    this.current = this.head
    let str = this.current.element
    while (this.current.next) {
    this.current = this.current.next
    str = str + ' ' + this.current.element
    }
    console.log(str)
    return str
    }
    }
    // 测试⽤例
    var linkedList = new LinkedList()
    linkedList.append(5)
    linkedList.append(10)
    linkedList.append(15)
    linkedList.append(20)
    linkedList.log() // '5 10 15 20'
    linkedList.removeAt(1)
    linkedList.log() // '5 15 20'
    linkedList.insert(1, 10)
    linkedList.log()
    索引: O(n)
    搜索: O(n)
    插⼊: O(1)
    移除: O(1)
    集合
  • 相关阅读:
    招聘测试开发二三事
    首次曝光:大厂都是这样过1024的,看的我酸了
    1024程序员节:今天,我们不加班!
    TesterHome创始人思寒:如何从手工测试进阶自动化测试?十余年经验分享
    ASP.NET网站中设置404自定义错误页面
    IIS 7 应用程序池自动回收关闭的解决方案
    ASP.NET项目中引用全局dll
    ASP.NET WebForm中前台代码如何绑定后台变量
    Git使用过程中出现项目文件无法签入Source Control的情况
    ASP.NET中身份验证的三种方法
  • 原文地址:https://www.cnblogs.com/zhouyideboke/p/12973486.html
Copyright © 2011-2022 走看看