链表及双向链表

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表及双向链表相关的知识,希望对你有一定的参考价值。

链表及双向链表

这里暂时不谈环形链表(circular linked list)。

链表

链表是一个非常有用的结构,与数组不同,它并不要求数据结构的内存地址保存在一起,而是可以通过指针/引用的方式,获取下一个结点的位置,因此,链表结构可以将散落的数据串联在一起,更大程度的利用空间,减少数据的重排。

链表结构如下:

1 2 3 4 null

每一个节点包含当前的值,以及下一个结点的引用。结点代码如下:

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 加到链表的头部,其实现如下:

    1. 新建一个 Node:

      0 1 2 3 4 head
    2. 将新建结点的 next 指向原有的 head

      0 1 2 3 4 head
    3. 将原有的 head 重置为现在的 head

      0 1 2 3 4 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,而是将新建的结点连到当前链表最后一个结点后。其逻辑如下:

    1. 新建一个 Node:

      1 2 3 4 5 head
    2. 让当前链表中最后一个元素的 next 指向新建的结点

      javascript普通链表及双向链表

      Java数据结构—— 双向链表及带傀儡节点双向链表的实现

      数据结构与算法-->>双向链表环形链表及约瑟夫问题

      单向链表和双向链表的原理及其相关实现

      带头结点的双向循环链表及相应的操作

      双向链表的简单Java实现-sunziren