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;
}
};
- 时间复杂度 --- 遍历链表,n为链表长度
- 空间复杂度 --- 链表为必要空间,无额外辅助空间。
总结
- 本题仅涉及链表的基础操作。