1. 链表:
  2. 修改指针
  3. 拼接链表
  4. 虚拟头 -> 快慢指针 -> 穿针引线 -> 先穿再排后判空
  5. 环,边界,前后序
  6. 链表的价值:不必要求物理内存的连续性,只要对插入和删除友好即可

简单介绍一下:

链表和数组,说到底都是计算机的内存,

数组是连续的内存,
链表是依靠指针寻找下一个内存单元;

链表的插入,删除,遍历操作

  1. 插入
  2. nex = 当前节点.next
  3. 当前节点.next = 插入的指针
  4. 插入指针.next = tmp
  5. 删除
  6. cur.next = cur.next.next
  7. 遍历
  8. 迭代
  9. cur = head
  10. while cur != null {
  11. print(cur)
  12. cur = cur.next
  13. }
  14. 递归
  15. dfs(cur) {
  16. if cur == null return
  17. print(cur.val)
  18. return dfs(cur.next)
  19. }

指针的修改

1、链表的反转

  1. #206. 反转链表 ->整体反转
  2. var reverseList = function(head) {
  3. let pre = null;
  4. let cur = head;
  5. // 遍历链表
  6. while (cur !== null) {
  7. let next = cur.next; //引用第三个变量,记住反转前的下一个指针
  8. cur.next = pre; // 反转
  9. pre = cur; // 移动指针
  10. cur = next; // 移动指针
  11. }
  12. return pre;
  13. };
  14. #92. 反转链表 II ->局部反转