leetcode203. 移除链表元素

题目

删除链表中等于给定值 val 的所有节点。

示例

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

个人解题代码(正确版)

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val){
        ListNode* sentinel = new ListNode(0);
        sentinel->next = head;
        ListNode* ret = sentinel;
        while(sentinel->next != NULL){
            if(sentinel->next->val == val){
                sentinel->next = sentinel->next->next;
            }else{
                sentinel = sentinel->next;
            }
        } 
        return ret->next;
    }
};

在这里插入图片描述

思路

  • 第一种情况:此题如果是要删除中间节点,那么只需要用【删除节点】的前一个节点prev,将prev的next指向【删除节点】的后一个节点。

【图源自leetcode,侵删】

  • 第二种情况:要删除一个or多个位于链表头部的节点。那么这就需要用哨兵节点【sentinel】来解决它。
    在这里插入图片描述

【图源自leetcode,侵删】

首次用哨兵节点解决问题时,遇到了错误:member access within null pointer of type 'struct ListNode’

通过查阅CSDN博主【冬日and暖阳】解决了这个bug,以下是博主的链接。

https://blog.csdn.net/qq_29007291/article/details/82184134

错误出现原因
: 因为试图使用空指针。

解决方法
:增加判断条件,排除对空指针的引用。(也就是说,在我的while循环里面,需要排除对空指针的引用)

错误版本

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val){
        ListNode* sentinel = new ListNode(0);
        sentinel->next = head;
        ListNode* ret = sentinel;
        //此处错误,因为没有排除头结点【哨兵节点的next节点】
        //是否为空
        while(sentinel != NULL){
            if(sentinel->next->val == val){
                sentinel->next = sentinel->next->next;
            }else{
                sentinel = sentinel->next;
            }
        } 
        return ret->next;
    }
};

正确版本

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val){
        ListNode* sentinel = new ListNode(0);
        sentinel->next = head;
        ListNode* ret = sentinel;
        while(sentinel->next != NULL){
            if(sentinel->next->val == val){
                sentinel->next = sentinel->next->next;
            }else{
                sentinel = sentinel->next;
            }
        } 
        return ret->next;
    }
};
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页