多个元素组成的列表,元素之间存储不连续,通过next指针连在一起


链表的结构:

  • js中没有链表,但我们可以用对象进行模拟 ```javascript // 链表:多个元素通过next连接而成的列表 const a = { val: “a” }; const b = { val: “b” }; const c = { val: “c” }; const d = { val: “d” };

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

  1. - 链表的遍历
  2. ```javascript
  3. // 1.创建一个指针指向第一个元素
  4. let point = a;
  5. while (point) {
  6. console.log(point.val);
  7. // 2.通过这个元素的next属性不断指向下一个元素
  8. point = point.next;
  9. }
  • 链表的插入
    const e = { val: "e" };
    c.next = e;
    e.next = d;
    
  • 链表的删除


c.next = d;

js中的原型链:

  • 首先我们要知道js的原型链本质上是一个链表,是一个通过proto作为指针连接起来的链表,例如以下
const obj = {};
const fn = function () {

}
const arr = [];
// 表示沿着原型链查找
obj --> Object.prototype --> null;
fn --> Function.prototype --> Object.prototype --> null;
arr --> Array.prototype --> Object.prototype --> null;

实例对象可以沿着原型链找到构造函数的原型对象,最后Object.prototype沿着原型链只能找到null。

  • 其次我们要知道原型链上属性的查找机制:
    • 如果我们要在一个实例对象上查找一个属性,我们们首先会在这个对象身上查找,其次我们会沿着其原型链查找,也就是找到其构造函数的prototype,最后找到Object.prototype如果还没有就返回null。
// 如果在A对象上没有找到x属性那么会沿着原型链寻找x属性
let arr = [];
Object.prototype.x = "x";
console.log(arr.x); // 输出:'x'
  • 最后是我们的instancesOf方法
    • 如果A沿着原型链可以找到B.prototype那么A instancesOf B便为true
    • 我们可以手动实现一下instancesOf方法


const instancesOf = (A,B) => {
    let p = A;
    while (p) {
        if (A === B.prototype) {
            return true
        }
        p = p.__proto__;
    }
    return false;
}

链表的两个基本题:

  • L237.删除链表中的节点
var deleteNode = function(node) {
    // 让当前节点的值为下一个节点的值
    node.val = node.next.val;
    // 让当前节点的next属性指向下下个节点
    node.next = node.next.next;
};
  • 15.反转链表
function ReverseList(pHead)
{
    // write code here
    let p1 = null;
    let p2 = pHead;
    while(p2) {
        let tmp = p2.next;
        p2.next = p1;
        p1 = p2;
        p2 = tmp;
    }
    // 此时p2已经指向了null,所以我们输出p1便好
    return p1;
}