数据结构_单向循环列表

复制代码
//单向循环链表
  
  class Node {
    constructor (data) {
      this.data = data
      this.next = null
    }
  }

  class CycleList {
    constructor () {
      this.head = null
      this.length = 0
    }
    //追加数据
    append (data) {
      let newNode = new Node(data)
      let current = this.head
      if (!this.head) {
        this.head = newNode
        newNode.next = this.head
      }else {
        while (current.next != this.head) {
          current = current.next
        }
        newNode.next = this.head
        current.next = newNode
      }
      this.length++
      return true
    }
    //插入数据
    insert (posi, data) {
      if (posi < 0 || posi > this.length) return false
      let newNode = new Node(data)
      let current = this.head
      let index = 0
      if (posi == 0) {
        if (this.head) {
          while (current.next != this.head) {
            current = current.next
          }
          newNode.next = this.head
          current.next = newNode
          this.head = newNode
        }else {
          this.head = newNode
          newNode.next = this.head
        }
      }else if (posi == this.length) {
        while (current.next != this.head) {
          current = current.next
        }
        current.next = newNode
        newNode.next = this.head
      }else {
        while (index++ < posi -1) {
          current = current.next
        }
        newNode.next = current.next
        current.next = newNode
      }
      this.length++
      return true
    }
    //删除指定位置数据
    removeAt (posi) {
      if (posi < 0 || posi > this.length - 1) return false
      let current = this.head
      let index = 0
      if (posi == 0) {
        if (this.length != 1) {
          while (current.next != this.head) {
            current = current.next
          }
          current.next = this.head.next
          this.head = this.head.next
        }else {
          this.head = null
        }
      }else {
        while (index++ < posi - 1) {
          current = current.next
        }
        current.next = current.next.next
      }
      this.length--
      return true
    }
    remove (data) {
      //删除所有data的数据
      while (this.indexOf(data) != -1) {
        //删除第一个出现的data数据
        this.removeAt(this.indexOf(data))
      }
      return true
    }
    //查找
    indexOf (data) {
      //遍历
      let current = this.head
      let index = 0
      while (current.next != this.head) {
        if (current.data === data ) {
          return index
        }else {
          index++
          current = current.next
        }
      }
      if (current.data === data) {
        return index
      }
      return -1
    }
    isEmpty () {
      return this.head == null
    }
    size () {
      return this.length
    }
  }

  let cList = new CycleList()
  cList.append(0)
  cList.append(1)
  cList.append(2)
  cList.append(3)
  cList.append(4)
  cList.append(5)
  cList.insert(0, 'start')
  cList.insert(7, 'end')
  cList.insert(4,'four')
复制代码

 

posted @   前端之旅  阅读(302)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示