JZ18 删除链表的节点

90 阅读1分钟

Day20 2023/01/27

题目链接

难度:简单

题目

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

1.此题对比原题有改动

2.题目保证链表中节点的值互不相同

3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

数据范围:

0<=链表节点值<=10000

0<=链表长度<=10000

示例

输入:{2,5,1,9},5
返回值:{2,1,9}
说明:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9

思路


从头开始遍历链表,比较节点数据,如果相等就删除,最后返回头节点即可。

关键点


  • 表头加入一个虚拟头节点,以便统一删除操作。
  • if判断里面使用cur->next->val,代表当前判断的是cur所指节点的下一个节点,方便删除操作(因为cur为当前判断节点的前驱节点)。

算法实现


c++代码实现

class Solution {
  public:
    ListNode* deleteNode(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(-1);
        dummyHead->next = head; //表头加入虚拟头节点
        ListNode* cur = dummyHead; //遍历指针,表示当前待判断节点的前驱节点
        while (cur->next) { 
            if (cur->next->val == val) cur->next = cur->next->next;
            else cur = cur->next;
        }
        return dummyHead->next;
    }
};
  • 时间复杂度 O(n)O(n) --- 遍历链表,n为链表长度
  • 空间复杂度 O(1)O(1) --- 链表为必要空间,无额外辅助空间。

总结

  • 本题仅涉及链表的基础操作。