🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。
🚁 个人主页:不 良
🔥 系列专栏:🛸剑指 Offer
📕 学习格言:博观而约取,厚积而薄发
🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同成长! 🌹
剑指 Offer 18. 删除链表的节点
题目:
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例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
被删除的节点
思路一:
双指针法。因为题目中保证链表中节点的值互不相同,所以我们可以通过比较链表中节点值是否和
val
相等来删除节点。链表头节点为空的情况就不再细说,直接返回
nullptr
;情况1.先判断头节点是否等于
val
,如果等于val
直接返回头节点的下一个节点即返回head->next
;
情况2.如果头节点不等于
val
,则设置两个节点prev
和cur
分别记录上一个节点和当前节点,如果cur
节点的值等于val
,则让prev
节点的next
指针指向cur
节点的下一个节点即prev->next = cur -> next
;
情况3.如果
cur
节点的值不等于val
,则通过prev = cur;cur = cur->next;
继续向后遍历链表直至当cur
为空。
代码如下:
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
//判断头节点是否为空,此步可以省略,并不影响提交
if(head == nullptr)
return nullptr;
//当head->val等于val时,返回head节点的下一个节点
if(head->val == val)
{
head = head->next;
return head;
}
ListNode* cur = head;//当前节点
ListNode* prev = head; //上一个节点
while(cur)
{
//当节点值等于val时,让prev节点的next指针指向cur节点的下一个节点
if(cur->val == val)
{
prev->next = cur->next;
//这里用break或者return head;都可以
//return head;
break;
}
//如果不相等,则继续向后遍历
prev = cur;
cur = cur->next;
}
return head;
}
};
时间复杂度:
O(N)
空间复杂度:O(1)