2. 链表

2.1 移除链表元素

203. 移除链表元素 简单
707. 设计链表 中等
206. 反转链表 简单
24. 两两交换链表中的节点 中等
19. 删除链表的倒数第 N 个结点 中等
面试题 02.07. 链表相交 简单
142. 环形链表 II 中等
203707

对于链表的操作,最好是设置一个虚拟头结点,这样子可以统一操作。当设立cur来遍历时,要注意判断是要cur != nullptr还是cur->next != nullptr

206反转链表

  1. 方法一:建立vector存储节点,再反向遍历vector以翻转链表
  2. 方法二:双指针法,一个pre指向前节点,初始值为null,一个cur指向当前节点。具体操作时node = cur; cur = cur->next; node->next = pre; pre = node;
  3. 方法三:递归 (未完成)

24两两交换链表中的节点

模拟,设立虚拟头结点,设立虚拟头结点在大多数情况下都是友好的。建立cur指向当前遍历节点,node1为两两节点的第一个,若没有第二个,则break,有第二个则为node2。然后模拟交换情况即可,再设立一个节点pre

19删除链表的倒数第N个节点

依然是要建立虚拟头结点

  1. 建立vector保存节点地址,然后之后链表长度后,计算index来删除倒数第N个节点
  2. 双指针,经典的快慢指针法,left和right指针,先让right指针走n+1步,然后left和right一起走,直到right==nullptr,这时,left就指向要删除节点的前一个。这也是为什么right要走n+1步的原因

面试题 02.07. 链表相交

双指针,这一题没必要设立虚拟头结点。设立cur_a和cur_b同时遍历两个链表,当到Nullptr时,从另一条链表头部开始重新遍历,假设两条链表长度为m和n,那么当遍历m+n次之后,他们一定会同时到达nullptr,然后每遍历一次判断一次是否相交即可

142. 环形链表 II

  1. 哈希表法。用哈希表记录到达过的节点,如果发现节点已经记录过,则为第一个环形节点
  2. 双指针法:快慢指针法+数学推算。非常有趣。可以看随想录的解说。建立一个slow和一个fast,它们一个走一步一个走两步,如果有环形它们就一定会相交。x + y = n(y + z) + y