学习js数据结构与算法-链表(2)

100 阅读2分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。

个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。

第十二天:继续了解链表

理解了链表是什么之后,现在就要开始实现我们的数据结构了。

前面,我们知道链表有一个首指针,指向第一个节点。有一个数量记录着指针的长度。所以,我们可以先写下下面的链表类。

class LinkedList {
    constructor() {
        this.count = 0;
        this.head = null;
    }
}

每个节点我们也知道,他有一个是值,一个是指向下一个节点的指针,所以我们可以写下下面的节点类,当一个Node实例被创建时,它的next指针总是null,因为我们知道它会是链表的最后一项。

class Node {
    constructor(element) {
        this.element = element
        this.next = null
    }
}

然后就是LinkedList类的一些方法。

  • push(element):向链表尾部添加一个新的元素。
  • insert(element, position):向链表指定位置插入一个新的元素
  • getElementAt(index):返回链表中特定位置的元素。如果链表中不存在这样的元素,则返回undefined。
  • remove(element):从链表中移除一个元素。
  • indexOf(element):返回元素在链表中的索引。如果链表中没有该元素则返回-1。
  • removeAt(position):从链表的指定位置移除一个元素。
  • isEmpty():如果链表中不包含任何元素,返回true,如果链表长度大于0则返回false。
  • size():返回链表包含的元素个数。
  • toString():返回标志整个链表的字符串。

向链表对象尾部添加一个元素时,可能有两种场景:链表为空,添加的事第一个元素。第二个种,链表不为空,我们向这对象追加元素。

push(element){
    const node = new Node(element);
    if(this.head === null) {
        this.head = node;
    }else {
        let current = this.head
        // 如果当前的next不是指向空,那么就证明他还有元素,继续遍历下去,直到指向空,那么就代表已经到达链表尾部了,添加这个node节点。
        while(current.next !== null) {
            current = current.next;
        }
        current.next = node;
    }
    this.count++;
}