题目
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 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 被删除的节点
解题代码
个人做法:
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
ListNode* cur = head, * pre = head->next;
if(cur->val == val) {
head = head->next;
return head;
}
while(pre->val != val){
pre = pre->next;
cur = cur->next;
}
cur->next = pre->next;
return head;
}
};
少定义一个节点也会对时间和内存消耗有帮助。
其他作者的解法:
①
作者:Orange
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
ListNode* dummy = new ListNode(-1);
dummy->next = head; //建立虚拟头节点
ListNode* cur = dummy;
while(cur->next)
if(cur->next->val == val) cur->next = cur->next->next;
else cur = cur->next;
return dummy->next;
}
};
接近双百。
思路:
- 定义一个哑节点,哑节点在头节点的前面。
哑节点的作用:哑节点(dummy node)是初始值为NULL的节点,创建在使用到链表的函数中,可以起到避免处理头节点为空的边界问题的作用,减少代码执行异常的可能性。
哑节点的使用可以对代码起到简化作用(省略当函数的入口参数为空时的判断)
- 后面思路和自己的思路一样。
②
作者:RT Huang
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
if(head==NULL)return NULL;
if(head->val==val)return head->next;
ListNode *p=head;
while(p->next){
if(p->next->val==val){
p->next=p->next->next;
break;
}
p=p->next;
}
return head;
}
};
思路清晰,对head节点的分析明确。