当先锋百科网

首页 1 2 3 4 5 6 7

题目内容:

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

注意:此题对比原题有改动

示例 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;
    }
};

参考:剑指题解