题目

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

示例 1:
示例.jpg

  1. 输入:head = [1,2,6,3,4,5,6], val = 6
  2. 输出:[1,2,3,4,5]

示例 2:

  1. 输入:head = [], val = 1
  2. 输出:[]

示例 3:

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

提示:

  • 列表中的节点数目在范围 [0, 104]
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

    解题方法

    虚拟节点

    设置虚拟节点,方便对头结点的操作。
    时间复杂度O(n),空间复杂度O(1)
    class Solution {
    public:
      ListNode* removeElements(ListNode* head, int val) {
          ListNode* _head = new ListNode(0);
          _head->next = head;
          ListNode* cur = _head;
          while (cur->next != nullptr) {
              if (cur->next->val == val) {
                  ListNode* tmp = cur->next;
                  cur->next = cur->next->next;
                  delete tmp;
              } else {
                  cur = cur->next;
              }
          }
          head = _head->next;
          delete _head;
          return head;
      }
    };
    

    递归法

    由于链表的递归属性,递归法书写更加简洁,但是增加空间复杂度。
    递归调用n次,时间复杂度O(n),空间复杂度O(n)
    class Solution {
    public:
      ListNode* removeElements(ListNode* head, int val) {
          if (head==nullptr) return head;
          head->next = removeElements(head->next, val);
          return head->val==val ? head->next:head;
      }
    };