编辑代码

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;

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

// 插入 e
const e = {val: 'e'};
c.next = e;
e.next = d;
console.log('链表 a:')
console.log(JSON.stringify(a));

// 删除 e
c.next = d;
console.log('删除节点 e:')
console.log(JSON.stringify(a));


/*********** leetcode 237 删除链表中的节点 *******/
// 给定 [4, 5, 1, 9] node = 5
// 删除后变为 [4, 1, 9]

// 由于无法知道 node 的前一个 node 所以无法使用 nodePre.next = nodeNext 方式删除
// step1 -> 将当前 node 值指向下一节点值
// step2 -> 将当前 node next 指向下一节点
function deleteNode(node){
    node.val = node.next.val; 
    node.next = node.next.next;
}

// 测试删除链表中的 b
deleteNode(b);
console.log('删除任意给定节点,比如节点 b:')
console.log(JSON.stringify(a));


/************* leetcode 206 反转链表 ***************/
// 1 -> 2 -> 3 -> 4 -> 5 -> NULL
// 5 -> 4 -> 3 -> 2 -> 1 -> NULL

// 双指针遍历链表
function reverseList(head){
    let p1 = head;
    let p2 = null;
    while(p1){
        const tmp = p1.next;
        p1.next = p2;
        p2 = p1;
        p1 = tmp;
    }
    return p2;
}
console.log(reverseList(a));

// tmp -> {val: 'c', next: {val: 'd'}}
// p1.next -> null
// p2 -> {val: 'a', next: null}
// p1 -> {val: 'c', next: {val: 'd'}}

// tmp -> {val: 'd'}
// p1.next -> {val: 'a', next: null}
// p2 -> {val: 'c', next: {val: 'a', next: null}}
// p1 -> {val: 'd'}

// tmp -> undefined
// p1.next -> {val: 'c', next: {val: 'a', next: null}}
// p2 -> {val: 'd', next: {val: 'c', next: {val: 'a', next: null}}}
// p1 -> undefined