class Node {
constructor(element, next) {
this.element = element
this.next = next
}
}
class LinkList {
constructor() {
this.head = null //初始head为null
this.size = 0 //初始长度也是为null
}
add(index, element) {
//如果是传入的一个参数默认往链表的最后的next去追加,并且这个传入的值就是element
if (arguments.length == 1) {
element = index
index = this.size
}
if (index == 0) { //如果传入了2个参数,并且第一个参数为0的话那就是改变head
let head = this.head
this.head = new Node(element, head)
} else {
//先取出现在的链表
let current = this.head
for (var i = 0; i < index - 1; i++) { //size是整个链表结构的对象长度,真实我们去遍历的时候需要减去1
current = current.next
}
current.next = new Node(element, current.next) //新建一个node类,传入新建的值,它的next肯定是null,因为current.next就是没有的
}
this.size++
}
remove(index) { //移除的时候传入的是第一个,这个第几个是按照下表算的0,1,2,3(比如现在添加了2个,需要移除第二个就是传入的1)那我需要取到他的前一个
if (index == 0) { //如果传入的时候是0说明要移除head指向的那个
this.head = this.head.next
} else {
let idx = index - 1
console.log(idx, 'idx');
let current = this.head
for (var q = 0; q < idx; q++) {
current = current.next
}
if (!current) return //说明删除的时候如果它的前一个都不存在说明根本没这个元素
// console.log(current,'删除的那一项前面的一个元素');
current.next = current.next.next //将移除的那个元素后面的next拼上去
}
this.size--
}
reverseList() { //翻转链表
function reverse(head) {
if (!head || !head.next) return head //如果传入的head链表是空的直接结束,或者只有一个的情况下也结束
//这里面来循环递归下
let newHead = reverse(head.next) //这样不管有几个next长度的链表一进来都会一直进去直到找到最后一个
head.next.next = head //只考虑两个的情况就是让第一个的next的next就是第二个的next指向1,然后让第一个的指向改为null
head.next = null
return newHead
}
this.head = reverse(this.head); //传入翻转前的链表,这里面的思想是反着执行的,如果多个会一直先进去递归,走到最后一个会return,然后最后循环的上一次循环(包括上一次循环之前的那些循环都是执行的两两翻转)就是开始翻转
return this.head;
}
}
let a = new LinkList()
a.add(0, 1)
a.add(2)
a.reverseList() //移除第二个就传入1
// a.add(3,888) 这样输入一个添加的长度超过本身的是不行的,因为这时候取出的
current本身就是空的
console.dir(a, {
depth: 100
});