matt-wang-FaFZCtl1yug-unsplash.jpg
简单给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:
LC.移除链表元素 - 图2
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:

输入:head = [], val = 1
输出:[]
示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/linked-list/f9izv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val, next) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.next = (next===undefined ? null : next)
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} val
  11. * @return {ListNode}
  12. */
  13. var removeElements = function (head, val) {
  14. if (head === null) {
  15. return null;
  16. }
  17. let fast = head.next;
  18. let slow = head;
  19. if (fast === null) {
  20. if (slow.val === val) {
  21. return null;
  22. }
  23. return slow;
  24. }
  25. while (fast !== null) {
  26. if (fast.val === val) {
  27. slow.next = slow.next.next;
  28. } else if (slow.val === val) {
  29. slow = fast;
  30. fast = fast.next;
  31. head = slow;
  32. continue;
  33. } else {
  34. slow = slow.next;
  35. }
  36. fast = fast.next;
  37. }
  38. if (slow.next === null && slow.val === val) {
  39. return null;
  40. }
  41. return head;
  42. };

思路:快慢指针(双指针)

  1. 首先排除特殊情况和。即head为null,此时直接返回null即可;
  2. 接下来设置快慢指针:

    1. let slow = head;
    2. let fast = head.next; // slow.next
  3. 此时第2个特殊情况出现了:即链表长度为1的情况。所以我们需要提前处理

    1. //链表长度为1显然fast为null
    2. if (fast === null) {
    3. if (slow.val === val) {
    4. // 当slow.val===val,唯一的节点也被删除了,所以只能返回null
    5. return null;
    6. }
    7. // 倘若slow.val!==val,直接返回slow即可
    8. return slow
    9. }
  4. 进入遍历,需要处理两种情况:1.慢指针slow.val===val; 2.快指针fast.val===val。

    1. while (fast !== null) {
    2. if (fast.val === val) {
    3. slow.next = slow.next.next;
    4. } else if (slow.val === val) {
    5. // 若慢指针slow.val===val,下面的操作就可以提前跳过了
    6. slow = fast;
    7. fast = fast.next;//slow.next
    8. head = slow;//重置头节点:因为这种情况下slow肯定是当前链表的头节点!不然fast肯定会先遇到fast.val===val的情况
    9. continue;
    10. } else {
    11. slow = slow.next;
    12. }
    13. fast = fast.next;
    14. }