skip to content

🔗链表了解一下?

// 声明节点
class Node {
  constructor(value) {
    this.value = value
    this.next = null
  }
}

// 单链表
class SingleLinkedList {
  constructor() {
    this.head = new Node('head')
  }
  // 末尾追加节点
  append(value) {
    let currentNode = this.head
    while (currentNode.next !== null) {
      currentNode = currentNode.next
    }
    let newNode = new Node(value)
    currentNode.next = newNode
    return newNode
  }
  // 根据value查找节点
  findNodeByValue(value) {
    let currentNode = this.head.next
    while (currentNode !== null && currentNode.value !== value) {
      currentNode = currentNode.next
    }
    return currentNode === null ? -1 : currentNode
  }
  // 根据index查找节点
  findNodeByIndex(index) {
    let currentNode = this.head.next
    let pos = 0
    while (currentNode !== null && pos !== index) {
      currentNode = currentNode.next
      pos++
    }
    return currentNode === null ? -1 : currentNode
  }
  // 转化ArrayList
  toArrayList() {
    let currentNode = this.head.next
    let arrayList = []
    while (currentNode !== null) {
      arrayList.push(currentNode.value)
      currentNode = currentNode.next
    }
    return arrayList
  }
  // 插入节点
  insertAfter(newValue, value) {
    let prevNode = this.findNodeByValue(value)
    if (prevNode === -1) {
      return -1
    } else {
      let newNode = new Node(newValue)
      newNode.next = prevNode.next
      prevNode.next = newNode
      return newNode
    }
  }
  // 根据value查找value的前一个节点y
  findPrevNodeByValue(value) {
    let currentNode = this.head
    while (currentNode.next !== null && currentNode.next.value !== value) {
      currentNode = currentNode.next
    }
    return currentNode.next === null ? -1 : currentNode
  }
  // 根据value删除节点
  removeNodeByValue(value) {
    let prevNode = this.findPrevNodeByValue(value)
    if (prevNode === -1) {
      return -1
    } else {
      prevNode.next = prevNode.next.next
      return this.toArrayList()
    }
  }
  // 反转链表
  reverse() {
    let currentNode = this.head.next
    let prevNode = null
    while (currentNode !== null) {
      let nextNode = currentNode.next
      currentNode.next = prevNode
      prevNode = currentNode
      currentNode = nextNode
    }
    this.head.next = prevNode
    return this.toArrayList()
  }
  // 清空链表
  clear() {
    this.head.next = null
    return this.toArrayList()
  }
  // 数组转单链表
  static arrayToLinkedList(arrayList) {
    if (!Array.isArray(arrayList)) {
      return -1
    } else {
      let sll = new SingleLinkedList()
      for (let i = 0; i < arrayList.length; i++) {
        let value = arrayList[i]
        sll.append(value)
      }
      return sll
    }
  }
  // 环验证
  checkCircle() {
    let slow = this.head
    let fast = this.head.next
    while (fast !== null && fast.next !== null) {
      fast = fast.next.next
      slow = slow.next
      console.log(`+++++++++++++++++++++++++`)
      console.log('slow', slow)
      console.log('fast', fast)
      console.log(`+++++++++++++++++++++++++`)
      if (slow == fast) return true
    }
    return false
  }
}

let sll = new SingleLinkedList()
for (let i = 0; i < 5; i++) {
  sll.append(`num ${i}`)
}
// console.log(sll.toArrayList())
// console.log(sll.findNodeByIndex(2))
// console.log(sll.findNodeByValue('num 3'))
// console.log(sll.insertAfter('xxx', 'num 3'))
// console.log(sll.removeNodeByValue('num 1'))
// console.log(SingleLinkedList.arrayToLinkedList([4, 2, 3, 6, 7]))

// 环验证测试
console.log(sll.checkCircle())
let n2 = sll.findNodeByIndex(2)
let n4 = sll.findNodeByIndex(4)
n4.next = n2
console.log(sll.checkCircle())