「这是我参与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++;
}