单向链表的实现,增加,删除,翻转-自我记录

189 阅读1分钟

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
});