// 声明节点
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())
上一篇
移动 Web 开发