链接列表JavaScript。比您想象的要容易。
#javascript #react #node #datastructures

考虑数据结构,让我们仔细研究链接列表。

链接列表是最受欢迎,最有效的数据结构之一。基本上,链接列表是“节点”的集合,每个节点都包含 data next 上一个,基本上是 next 涉及下一个节点,上一个是指以前的节点。

我们可以说,数组和链接列表相似。但是在数组中,元素存储在特定位置或索引中。

另一方面,在链接列表中,所有内容都可以用作单独的对象。每个元素(节点)包含一些内容,数据,链接到下一个节点,链接到上一个节点。

链接列表的类型:
链接列表有三种类型,

1。单链接列表:每个节点都包含数据和指向下一个节点的指针。基本上是单向。

Image description

分析上述图像,它以 head 开始,因此 head 是入口点。如果链接列表为空,则 head 将为null。因此, head 引用第一个节点, last 节点指向null。

const linkedList = {
    head: {
        value: 5
        next: {
            value: 7                                             
            next: {
                value: 2
                next: {
                    value: 15
                    next: null  
                    }
                }
            }
        }
    }
};

基本示例,

// class of node
class ListNode {
    constructor(data) {
        this.data = data
        this.next = null                
    }
}

/* LindedList class. remember, if the head node is not passed then head will be null */
class LinkedList {
    constructor(head = null) {
        this.head = head
    }
}

/* lets create some nodes */

let node1 = new ListNode(5) // data will be 5
let node2 = new ListNode(7) // data will be 7
let node3 = new ListNode(2) //  data will be 2
let node4 = new ListNode(15) // data will be 15

node1.next = node2 // points to the node2
node2.next = node3 // points to the node2
node3.next = node4

let list = new LinkedList(node1) // Linked List completed

的优势和单独链接列表的用途

- 动态数据结构:内存动态分配给链接列表。我们可以很容易地添加或删除元素。我们不需要考虑初始尺寸。
- 实现:在这里可以轻松实现其他数据结构,例如队列和堆栈。
- 多功能性:衬里列表可用于实现广泛的数据结构,例如堆栈,队列,图形,图形,真实和具有表。

单独链接列表的缺点

- 纪念用法:我们需要存储下一个数据的地址,因此需要更多的内存。
- 访问元素:无法直接访问任何元素。如果我们需要找到n个值,那么我们需要穿越直到找到nth元素。
- 反向遍历:单独链接的列表不可能。因为我们没有上一个指针的内存地址。
- 更复杂的实现:与数组相似,其实现非常复杂。我们需要了解动态内存位置和指针操作。
- 缺乏缓存局部性:它可能无法利用现代处理器中的缓存机制。其性能较慢。

2。双重链接列表:每个节点包含两个指针一个用于下一个节点,一个用于以前的节点。

Image description

在上图中,我们了解,

  • prev:指的是先前的节点
  • 数据:数据项
  • 下一个:下一个节点的地址

下图显示了我们的表示链接列表的表示形式,此处每个节点都包含 next _和_prev to point 下一个节点 prev node

Image description

基本示例

class ListNode  {
    constructor(value) {
        this.value = value;
        this.next = null;
        this.previous = null;
    }
}

class DoublyLinkedList {
    constructor(value) {
        this.head = {
            value: value,
            next: null,
            previous: null
        };
        this.length = 0;
        this.tail = this.head;
    }

    // Insert node at end of the list
    add(newNode) {
        this.tail.next = newNode;
        newNode.previous = this.tail;
        this.tail = newNode;
        this.length++;
    }

    printList() {
        let current = this.head;
        let result = [];
        while (current !== null) {
            result.push(current.value);
            current = current.next;
        }
        console.log(result.join(' '));
        return this;
    }
}

let numList = new DoublyLinkedList();
numList.add(new ListNode (12));
numList.add(new ListNode (13));
numList.add(new ListNode (14));
numList.add(new ListNode (15));
numList.add(new ListNode (16));
numList.add(new ListNode (17));
numList.printList();
console.log(numList)
console.log(numList.head)

双重链接列表的优势:

- 反向:反向双重链接列表非常容易。
- traversal:此双重链接列表的遍历是双向的,在单链接列表中是不可能的。
- 删除:与单链接列表相比,节点的删除很容易。

双重链接列表的缺点:

  • 与数组和单链接列表相比,它使用额外的内存。
  • 遍历双重链接列表的范围比遍历单个链接列表
  • 实现和维护双链接列表可能比单链接列表更复杂。

使用双重链接列表的使用:

- 导航系统:它用于需要前后导航的导航系统中。
- 撤消和重做:它也被各种应用程序使用来实现撤消和重做功能。
-mru/lru:双链接列表也用于构建MRU/LRU(最/最不最近使用的)缓存。
- 线程调度程序:在许多操作系统中,线程调度程序(选择在此时需要运行的过程)保持当时运行的所有过程的双关联列表。<
- 浏览器:下一页和上一页。
- 图像查看器:接下来和上一个图像

  • 实施**图**算法

3。循环链接列表:它与其他链接列表不同,其最后一个节点指向第一个或任何其他节点。
它有两种类型,

  • 圆形单链接列表
  • 圆形双链接列表

我们将在下一个中学习循环链接列表。就是这样。见Yaaa。