剑指 Offer 18. 删除链表的节点
🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。
🚁 个人主页:不 良
🔥 系列专栏:🛸剑指 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)