1.单向链表
class Node {
constructor(element, next) {
this.element = element
this.next = next
}
}
class LinkedList {
constructor() {
this.head = null;
this.size = 0;
}
add(index, element) {
if (arguments.length === 1) {
element = index
index = this.size
}
if (index < 0 || index > this.size) throw new Error('越界')
if (index === 0) {
// 取到老的头
let head = this.head
this.head = new Node(element, head)
} else {
// 找到当前索引的上一个
let prevNode = this.getNode(index - 1)
prevNode.next = new Node(element, prevNode.next)
}
this.size++
}
getNode(index) {
let current = this.head;
for (let i = 0; i < index; i++) {
current = current.next
}
return current
}
reverseLinkList() {
const reverse = head => {
if (head === null || this.head.next === null) return head;
let newHead = reverse(head.next)
head.next.next = head;
head.next = null;
return newHead;
}
this.head = reverse(this.head)
return this.head
}
reverseLinkList2(){
// A -> B -> C -> D
// D -> C -> B -> A
let head = this.head;
if (head === null || this.head.next === null) return head;
let newHead = null;
while(head !== null){
let temp = head.next; // save B
head.next = newHead; // A -> null
newHead = head; // newHead -> A
head = temp; // head -> B
}
this.head = newHead
return newHead
}
}
const ll = new LinkedList()
ll.add(0, 100)
// ll.add(0, 200)
ll.add(300)
// ll.add(1, 500)
console.dir(ll, { depth: 1000 })