1. 增加
尾部增加
add(value) {
if (value === undefined) {
throw new Error("value can not assign to undefined");
}
let newNode = new ListNode(value);
if (this.size === 0) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.size++;
}
指定位置添加
// 指定位置添加
addLocation(index, value) {
if (value === undefined) {
throw new Error('value is undefined!')
}
if (index < 0 || index > this.size) {
throw new Error('index out of size')
}
if (index === this.size) {
this.add(value)
}
else {
let newNode = new List(value)
if (index === 0) {
newNode.next = this.head
this.head = newNode
} else {
let node = this.head
for (let i = 0;i < index - 1; i++) {
node = node.next
}
newNode.next = node.next
node.next = newNode.next
}
this.size++
}
}
2. 删除
尾部删除
delete() {
if (this.size === 0) {
throw new Error('Can not delete,because this list is Empty!')
}
if (this.size === 1) {
this.head = null
this.tail = null
} else {
let node = this.head
for (let i = 0;i < this.size - 2; i++) {
node = node.next
}
node.next = null
this.tail = node
}
this.size--;
}
指定项删除
// 向链表指定位置删除一个元素
deleteOf(index) {
if (index < 0 || index >= this.size) {
throw new Error("index out of range");
}
if (index === this.size - 1) {
this.delete();
} else {
if (index === 0) {
let next = this.head.next;
this.head.next = null; // 不写可能会有内存泄漏问题
this.head = next;
} else {
let node = this.head;
for (let i = 0; i < index - 2; i++) {
node = node.next;
}
let next = node.next;
node.next = next.next;
next.next = null; // 不写可能会有内存泄漏问题
}
this.size--;
}
}
3. 更新
// 更新指定位置
update(index, value) {
if (value === undefined) {
throw new Error('value is undefined!')
}
if (index < 0 || index >= this.size) {
throw new Error("index out of range");
}
let node = this.head
for (let i = 0; i < index; i++) {
node = node.next
}
node.value = value
}
4. 查看指定位置的元素
// 查看链表指定位置的元素
indexOf(index) {
if (index < 0 || index >= this.size) {
throw new Error("index out of range");
}
let node = this.head;
for (let i = 0; i < index; i++) {
node = node.next;
}
return node.value;
}
5. 对链表的每一项做出对应操作
forEach(fuc) {
for (let node = this.head;node != null;node = node.next) {
fuc(node.value)
}
}