创建代码
// 创建节点
class Node {
constructor(element) {
this.element = element;
this.next = null;
}
}
// 创建链表
class MyLinkedList {
constructor() {
// 初始头节点为空
this.head = null;
// 链表长度
this.length = 0;
}
// 获取链表 即获取头指针
getList() {
return this.head;
}
// 查找链表节点
search(element) {
let p = this.head;
if (!p) return false;
while (p) {
if (p.element === element) return true;
p = p.next;
}
return false;
}
// 追加链表节点
append(element) {
let node = new Node(element);
// 当链表为空时
if (!this.head) {
this.head = node;
} else {
this.getNode(this.length - 1).next = node;
}
// 最后整个链表长度加1
this.length += 1;
}
// 在指定位置追加链表节点
appendAt(index, element) {
// 判断index的有效性 index 可以取链表长度位置
if (index < 0 || index > this.length) {
throw new Error("index out range");
}
let node = new Node(element);
// 当在index为0 时追加节点时
if (index === 0) {
node.next = this.head;
this.head = node;
} else {
let prev = this.getNode(index - 1);
// 注意顺序
node.next = prev.next;
prev.next = node;
}
this.length += 1;
}
// 删除链表节点
remove(index) {
if (index < 0 || index >= this.length) {
throw new Error("out positon range");
}
let current = this.head;
// 当在第一位删除的时候
if (index === 0) {
this.head = current.next;
// 当在中间删除的时候
} else {
let prev = this.getNode(index - 1);
current = prev.next;
prev.next = current.next;
}
this.length -= 1;
}
// 根据索引查找节点
getNode(index) {
// 对传入的索引进行限制
if (index < 0 || index >= this.length) {
throw new Error("out range");
}
let current = this.head;
for (let i = 0; i < index; i++) {
current = current.next;
}
return current;
}
// 查找指定节点值得索引
indexOf(element) {
for (let i = 0; i < this.length; i++) {
if (this.getNode(i).element === element) {
return i;
}
}
// 找不到 则 返回-1
return -1;
}
}
运行代码
const list = new MyLinkedList();
list.append(1);
list.append(2);
list.appendAt(2, 3);
list.appendAt(3, 4);
// list.remove(1);
console.log(list.indexOf(5));
console.dir(list, {
depth: 100,
});
做的时候一定要自己多画图找关系,千万不要盯着代码一直看,也可以通过以下视频链接学习
https://www.bilibili.com/video/BV1P5411H77a/?spm_id_from=trigger_reload