题目分析:[[EVD]] - 剑指 Offer 18. 删除链表的节点
https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/submissions/
简单描述:
- 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点
限制🚫
- 题目保证链表中节点的值互不相同
- 若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
示例:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
解题思路:
思路:
- #双指针 #递归
- 链表中节点的值互不相同,且不需要free节点,则简单做删除节点就行,用递归也行
效率:
- 时间复杂度
- 空间复杂度
代码:
- 1.递归
class Solution
{
public:
ListNode *deleteNode(ListNode *head, int val)
{
if (!head) // 终止条件,遍历结束
return NULL;
if (head->val == val)
return head->next;
head->next = deleteNode(head->next, val);
return head;
}
};
- 2.双指针
class Solution
{
public:
ListNode *deleteNode(ListNode *head, int val)
{
if (head->val == val)
return head->next;
ListNode *pre = head, *cur = head->next;
/*快慢指针同步遍历找到val,此时pre为val前继节点*/
while (cur && cur->val != val)
{
pre = cur;
cur = cur->next;
}
/*若找到val,删去cur节点*/
if (cur)
pre->next = cur->next;
return head;
}
};