题目内容:
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
思路:
方法一:递归
- 遍历链表,考虑边界以及分类:
- 如果当前链表为空,那么就直接返回head,因为空链表无法删除
- 如果链表不为空:
- 且head->val==val时,删除当前head,即返回head->next
- 但head->val!=val时,要沿着链表继续往下找,那么就递归寻找。且删除某个节点后,要记得把后面的节点连上。
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
if(!head) return head;
if(head->val == val) return head->next;
//递归删除
head->next = deleteNode(head->next,val);
return head;
}
};
方法二:单指针扫描
- 遍历链表,且初始时指针p=head处
- 当p->val==val,删除p,返回p后面的链表头节点
- 当p->next->val!=val,继续向后遍历,直到p->next-val==val为止。此时,删除p->next即可。
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
if(!head) return head;
if(head->val == val) return head->next;
ListNode* p=head;
while(p->next && p->next->val != val){
p=p->next;
}
if(p->next && p->next->val == val) p->next = p->next->next;
return head;
}
};
参考:剑指题解