203.移除链表元素

203.移除链表元素

题目链接:203. 移除链表元素(简单)

题目描述

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

示例 1:

输入: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
输出:[]

提示:

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

题解

思路:这道题需要弄清楚链表的基本操作原理

代码(C++版本):

注意:有头节点时,首元节点与非首元节点的操作一致;无头节点时,首元节点与非首元节点的操作不一样。

//对于没有头节点的链表来说,对 首元节点 与 其他节点 的操作是不一样的
ListNode* removeElements(ListNode* head, int val) {
   ListNode* p = head;//用于遍历head的所有节点
   //首元节点
   while (head != NULL && head->val == val) {
       head = head->next;
       delete p;
       p = head;
  }
   //非首元节点
   while (p != NULL && p->next != NULL) {
       ListNode* dp = p->next;//用于寻找将被删除的节点
       if (dp->val != val) {
           p = p->next;
      }
       else if (dp->val == val) {
           p->next = dp->next;
           delete dp;
      }
  }
   return head;
}

//对于有头节点的链表来说,对 首元节点 与 其他节点 的操作是一样的
ListNode* removeElements1(ListNode* head, int val) {
   //首先添加一个头节点,使首元节点的操作同非首元节点的操作一致
   ListNode* hp = new ListNode(0);//头节点
   //将头节点插入到链表当中
   hp->next = head;
   head = hp;

   ListNode *p = head;//用于遍历head的所有节点

   while (p != NULL && p->next != NULL) {
       ListNode* dp = p->next;//用于寻找将被删除的节点
       if (dp->val != val) {
           p = p->next;
      }
       else if (dp->val == val) {
           p->next = dp->next;
           delete dp;
      }
  }

   //将头节点移除
   head = hp->next;
   delete hp;

   return head;
}

分析:

  • 时间复杂度:O(n),需要遍历链表一次。

  • 空间复杂度:O(1)。

参考链接:

官方题解

代码随想录

 

posted @ 2021-11-02 09:38  wltree  阅读(103)  评论(0编辑  收藏  举报