第五篇:链表

86 阅读1分钟

概念

  • 多个元素组成的链表
  • 元素存储不连续,用next指针连在一起

屏幕截图 2022-05-09 093139.png

数组VS链表

  • 数组:增删非首位元素往往需要移动元素
  • 链表:增删非首位元素,不需要移动元素,只需要更改next的指向即可

JS中的链表

  • JavaScript中没有链表
  • 可以用Object模拟链表
const a = { val: "a" };
const a = { val: "b" };
const a = { val: "c" };
const a = { val: "d" };

a.next = b;
b.next = c;
c.next = d

//遍历链表
let p = a;
while (p) {
    console.log(p.val);
    p = p.next;
}

//插入
const e = { val:"e" };
c.next = e;
e.next = d;

//删除
c.next = d;
e.next = null;
e = null;

删除链表中的节点 LeetCode 237

解题思路

  • 将被删除节点的值改为下个节点
  • 将被删除节点的next指针指向下下个节点
var deleteNode = function(node) {
    node.val = node.next.val;
    node.next = node.next.next;
};

反转链表 LeetCode 206

解题思路

  • 反转两个节点:将n+1的next指向n
  • 反转多个节点:双指针遍历链表,重复上述操作

双指针操作指的是,一个是正常遍历,一个是比正常顺序晚一位。

  • 正常顺序 4 1 5 9
  • 晚一位顺序 null 4 1 5 9
var reverseList = function(head) {
    let p = head;
    let p1 = null;
    while (p) {
        let temp = p.next;
        p.next = p1;
        p1 = p;
        p = temp;
    }
    return p1;
};