数据结构_反转链表_两两交换

复制代码
class Node {
    constructor (data) {
      this.data = data
      this.next = null
    }
  }
  class LinkList {
    constructor () {
      //初始化,空链表,长度为0
      this.head = null
      this.length = 0
    }
    //追加数据
    append (data) {
      // 创建新节点
      let node = new Node(data)
      // 当前为空链表
      if (!this.head) {
        // 让head指向新节点
        this.head = node
      }else {
        // 找到尾节点
        let current = this.head
        while (current.next) {
          current = current.next
        }
        current.next = node
      }
      this.length++
    }
    // 插入数据
    insert (posi, data) {
      // 判断position是否合法
      if (posi < 0 || posi > this.length) return false
      let node = new Node(data)

      if (posi == 0) {
        node.next = this.head
        this.head = node
      }else {
        let current = this.head
        let index = 0
        while (index++ < posi - 1) {
          current = current.next
        }
        node.next = current.next
        current.next = node
      }
      this.length++
      return true
    }
    // 查找数据
    indexOf (data) {
      let current = this.head
      let index = 0
      while (current) {
        if (current.data === data) {
          return index
        }
        index++
        current = current.next
      }
      return -1
    }
    // 移除指定位置数据
    removeAt (posi) {
      // Number.isInteger()判断是否为整数
      if (posi < 0 || posi > this.length -1) return false
      if (posi == 0) {
        this.head = this.head.next
      }else {
        let current = this.head
        let index = 0
        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
    }
    isEmpty () {
      return this.head == null
    }
    size () {
      return this.length
    }
    //反转链表
    reverseList () {
      let current = this.head
      let prev = null
      while (current) {
        let temp = current.next
        current.next = prev
        prev = current
        current = temp
      }
      this.head = prev
      return this
    }
    // 两两交换
    swap () {
      let tempNode = new Node(0)
      tempNode.next = this.head
      let prev = tempNode
      while (prev.next && prev.next.next) {
        let current = prev.next
        let buffer = prev.next.next
        prev.next = buffer
        current.next = buffer.next
        buffer.next = current
        prev = current
      }
      this.head = tempNode.next
      return this
    }
  }
  var list = new LinkList()
  list.append(1)
  list.append(2)
  list.append(3)
  list.append(4)
  list.append(5)
复制代码

 

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