链表及双向链表
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表及双向链表相关的知识,希望对你有一定的参考价值。
链表及双向链表
这里暂时不谈环形链表(circular linked list)。
链表
链表是一个非常有用的结构,与数组不同,它并不要求数据结构的内存地址保存在一起,而是可以通过指针/引用的方式,获取下一个结点的位置,因此,链表结构可以将散落的数据串联在一起,更大程度的利用空间,减少数据的重排。
链表结构如下:
每一个节点包含当前的值,以及下一个结点的引用。结点代码如下:
class Node
constructor(val, next)
this.val = val !== undefined ? val : 0;
this.next = next ? next : null;
链表本身的实现就比较简单了,下面实现一些比较基础的功能。
首先是 LinkedList 的基础结构:
class LinkedList
constructor()
this.head = null;
print()
let l1 = this.head;
let res = [];
while (l1?.next)
res.push(l1?.val, "->");
l1 = l1.next;
res.push(l1?.val);
console.log(res.join(" "));
这里简单的实现了一个 print
功能,直接打印会出现 circular object
这种情况。
此时初始化后 LinkedList
会输出一个空字符串:
-
appendToHead
这个方法的目的是新建一个 Node,并且将这个 Node 加到链表的头部,其实现如下:
-
新建一个 Node:
-
将新建结点的
next
指向原有的 head -
将原有的 head 重置为现在的 head
代码实现如下:
class LinkedList appendToHead(node) const newNode = node instanceof Node ? node : new Node(node); if (!this.head) return (this.head = newNode); newNode.next = this.head; this.head = newNode;
测试结果如下:
-
-
appendToTail
appendToTail 的实现与 appendToHead 相似,只不过这一次不是修改
this.head
,而是将新建的结点连到当前链表最后一个结点后。其逻辑如下:-
新建一个 Node:
-
让当前链表中最后一个元素的
next
指向新建的结点
-