题目:https://leetcode-cn.com/problems/remove-linked-list-elements/

image.png

循环

循环应该是最容易想出来的,遍历链表中的所有链表节点,找出与 val 值相同的节点然后将节点删除。

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} val
  11. * @return {ListNode}
  12. */
  13. var removeElements = function(head, val) {
  14. let prev = null;
  15. let current = head;
  16. while (current) {
  17. if (current.val === val) {
  18. if (current === head) {
  19. const next = current.next;
  20. head = next;
  21. current.next = null;
  22. current = next;
  23. } else {
  24. const tmp = current;
  25. prev.next = current.next;
  26. current = current.next;
  27. tmp.next = null;
  28. }
  29. } else {
  30. prev = current;
  31. current = current.next;
  32. }
  33. }
  34. return head;
  35. };

从上面的题解中,是需要对头节点进行单独的处理的,为了避免单独处理的问题,我们使用虚拟头节点的方式:

  1. /**
  2. * Definition for singly-linked list.
  3. * class ListNode {
  4. * val: number
  5. * next: ListNode | null
  6. * constructor(val?: number, next?: ListNode | null) {
  7. * this.val = (val===undefined ? 0 : val)
  8. * this.next = (next===undefined ? null : next)
  9. * }
  10. * }
  11. */
  12. function removeElements(head: ListNode | null, val: number): ListNode | null {
  13. const dummyHead = new ListNode(0);
  14. dummyHead.next = head;
  15. let prev = dummyHead;
  16. let current = dummyHead.next;
  17. while (current) {
  18. if (current.val === val) {
  19. const delNode = current;
  20. prev.next = current = delNode.next;
  21. delNode.next = null;
  22. } else {
  23. prev = current;
  24. current = current.next;
  25. }
  26. }
  27. return dummyHead.next;
  28. };

递归

思路:链表具有天然的递归性。对于链表来说,我们可以理解为一个一个节点的连接,也可以理解为一个节点链接又连接了一个更短的链表,以此类推。因此链表中的很多操作都可以通过链表来完成。

image.png

我们回到删除链表元素的问题上,当我们将链表分解为一个节点加上一个更短的链表之后,我们需要判断的就是头节点是否需要被删除。这对更短的链表也是一样的,我们判断一个更短的链表的头节点是否需要会被删除。

image.png

  1. function removeElements(head: ListNode | null, val: number): ListNode | null {
  2. if (head === null) {
  3. return null;
  4. }
  5. const head.next = removeElements(head.next, val);
  6. head.val === val ? head.next : head;
  7. };