链表是什么?
- 多个元素组成的列表
- 一般以链表的头节点表示该链表
- 元素存储不连续,用 next 指针连在一起
数组 VS 链表
- 数组:增删非首尾元素时往往需要移动元素
- 链表:增删非首尾元素,不需要移动元素,只需要更改 next 的指向即可
JS 中的链表
- JS 中没有链表,使用 Object 来模拟链表 ```javascript 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.声明一个指针,指向头节点 let p = a; while(p) { console.log(p.val); p = p.next; }
// 插入 const e = { val: ‘e’ } e.next = c.next; c.next = e;
// 删除 e c.next = e.next;
<a name="jn1Vw"></a>
### LeetCode 题
- 237.删除链表中的节点
- 思路
- 无法直接获取被删除节点的上一个节点
- 将被删除节点转移到下一个节点,或者说将下一个节点的值移到前一个节点
- 206.反转链表
- 思路
- 先考虑两个节点的反转,将 n+1 的 next 指向 n
- 再考虑反转多个节点:双指针遍历链表,重复上述操作
```javascript
// 1.创建两个指针,一前一后遍历链表
// 2.不断反转双指针
var reverseList = function(head) {
let p1 = head;
let p2 = null;
while(p1) {
let temp = p1.next;
p1.next = p2;
p2 = p1;
p1 = temp;
}
// p1 最后指向了 null
return p2;
}
- 2.两数相加