<script>
class Node {
constructor(item) {
this.item = item;
this.next = null;
}
}
class LinkedList {
constructor() {
// 链头
this.head = null
// 计数
this.count = 0
}
// push追加
push(item) {
let node = new Node(item)
if (this.head === null) {
this.head = node
} else {
// 不能随意动我们的链头,所以把他赋值给current
let current = this.head
// 循环找每个node的next是否为null
while (current.next !== null) {
current = current.next
}
current.next = node
}
this.count++
}
// 从指定位置删除
// removeAt(index) {
// if (index >= 0 && index <= this.count) {
// let current = this.head
// if (index === 0) {
// // 当删除的是链头的时候,吧链头下一个作为链头即可
// this.head = this.head.next
// this.count--
// } else {
// let prev
// for (let i = 0; i < index; i++) {
// prev = current
// current = current.next
// }
// prev.next = current.next
// }
// this.count--
// return current.item
// }
// return
// }
// 获取位置
getNodeAt(index) {
if (index >= 0 && index < this.count) {
let node = this.head
for (let i = 0; i < index; i++) {
node = node.next
}
return node
}
return
}
// 从指定位置删除
removeAt(index) {
if (index >= 0 && index <= this.count) {
let current = this.head
if (index === 0) {
// 当删除的是链头的时候,吧链头下一个作为链头即可
this.head = this.head.next
this.count--
} else {
let prev = this.getNodeAt(index - 1)
current = prev.next
prev.next = current.next
}
this.count--
return current.item
}
return
}
// 按照传入数值删除
/*
1.封装一个通过数据返回索引的方法
2.判断两个参数是否相等
3.在直接调用从指定位置删除的removeAt()方法
*/
// 通过数值返回索引方法
indexOf(item) {
let current = this.head
for (let i = 0; i < this.count; i++) {
// 如果当前元素等于传入的item元素值,就return他的索引
if (this.enqual(current.item, item)) {
return i
}
// 从链头到链尾
current = current.next
}
}
// 判断两个元素是否相等
enqual(a, b) {
return JSON.stringify(a) === JSON.stringify(b) // 返回的是一个布尔值
}
// 按照remove()删除,调用removeAt()
remove(item) {
let index = this.indexOf(item)
return this.removeAt(index)
}
}
let list = new LinkedList()
</script>
这里就是全部内容咯~