国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

leetcode鏈表題報錯 runtime error: member access within null pointer of type ‘ListNode‘

這篇具有很好參考價值的文章主要介紹了leetcode鏈表題報錯 runtime error: member access within null pointer of type ‘ListNode‘。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

今天在做leetcode203:移除鏈表元素時,反復遇到了報錯:runtime error: member access within null pointer of type ‘ListNode’ (solution.cpp),報錯提示的意思是試圖訪問’ListNode空指針類型的成員,就淺淺記錄一下修復bug的過程吧。。。。

剛開始的代碼是這樣的,邏輯是先建立一個頭結(jié)點放到鏈表頭部,這樣就可以統(tǒng)一鏈表結(jié)點刪除的操作了,然后創(chuàng)建ListNode類型指針cur,初始化其指向頭結(jié)點的下一個結(jié)點,利用while循環(huán)遍歷鏈表,當cur指針指向Null時停止遍歷。然后就報錯了…

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyNode=new ListNode(0);
        dummyNode->next=head;
        ListNode* cur=dummyNode->next;
        ListNode* tmp=nullptr;
        while(cur!=nullptr){
            if(cur->val==val){
                tmp=cur->next;
                cur->next=cur->next->next;
                delete tmp;
                cur=cur->next;
            }else   cur=cur->next;
        }
        head=dummyNode->next;
        delete dummyNode;
        return head;
    }
};

報錯的代碼行是:cur->next=cur->next->next;,報錯提示的意思是試圖訪問’ListNode空指針類型的成員,然后才發(fā)現(xiàn)原因出在:當移除的元素位于鏈表最后一個時,此時cur指向最后一個結(jié)點,cur->next為空,而訪問cur->nex->next就是訪問空指針的成員變量了

那么怎么解決這個問題呢?我最開始想到的辦法是是增加判斷語句,當cur指向的是最后一個結(jié)點時,就不執(zhí)行
cur->next=cur->next->next;操作,而是將前一個結(jié)點的next指針置為空,但是因為cur指向的是當前結(jié)點,所以沒有辦法操作上一個結(jié)點,這個辦法好像行不通。

于是我參考了代碼隨想錄中的參考答案如下:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 設置一個虛擬頭結(jié)點
        dummyHead->next = head; // 將虛擬頭結(jié)點指向head,這樣方面后面做刪除操作
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

可以發(fā)現(xiàn)這個代碼與我的代碼不同有兩點:第一是cur指針初始化時指向的是頭結(jié)點,而我的代碼cur指向是指向頭結(jié)點的下一個結(jié)點,即原始鏈表的第一個結(jié)點,第二是while循環(huán)中的條件為cur->next != NULL,即當cur結(jié)點的下一個結(jié)點不為空時繼續(xù)循環(huán),而我的代碼是cur!=nullptr,即當前結(jié)點不為空時繼續(xù)循環(huán)。

區(qū)別感覺很小,但是代碼隨想錄中的這份代碼并不會報錯,原因就在這份代碼的循環(huán)條件是cur->next != NULL,這樣保證了cur->next不為空,因此就不會出現(xiàn)訪問空指針的成員變量的情況;而且判斷某結(jié)點的值時利用的是cur->next ->val進行判斷,而不是讓cur指針直接指向該結(jié)點,即利用cur->val判斷,=這樣做的好處是判斷某一個結(jié)點的值時同時也能保留對其上一個結(jié)點進行修改的權利,這樣當需要刪除的元素在鏈表中最后一個時,可以很方便的將其前一個結(jié)點的next指針置為nullptr。

于是我參考代碼隨想錄把原始代碼改成了下面的代碼,但是一時腦癱的在if(cur->next->val==val)的作用域最后多加了一句cur=cur->next;,以為此時指針也要后移一位,結(jié)果又遇到了同樣的報錯,而且報錯轉(zhuǎn)移到了if(cur->next->val==val)這一行,最后才反應過來,如果待刪除元素位于鏈表最后,當執(zhí)行完cur->next=cur->next->next時,cur->next為空,如果這時執(zhí)行cur=cur->next;,則cur為空,等到下一次循環(huán)判斷時,又會訪問空指針成員變量,因此這一句不能加,同一個坑踩兩次了屬于是…而且在需要刪除的結(jié)點情況下,cur指針不用后移,因為下一次循環(huán)cur->next訪問的就是被刪除節(jié)點的下一個結(jié)點了,這個邏輯當時也沒理清。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyNode=new ListNode(0);
        dummyNode->next=head;
        ListNode* cur=dummyNode;
        ListNode* tmp=nullptr;
        while(cur->next!=nullptr){
            if(cur->next->val==val){
                tmp=cur->next;
                cur->next=cur->next->next;
                delete tmp;
                cur=cur->next;
            }else   cur=cur->next;
        }
        head=dummyNode->next;
        delete dummyNode;
        return head;
    }
};

最后總結(jié)來說:
1.利用讓cur指針的移動范圍為:[頭結(jié)點,倒數(shù)第二個結(jié)點],比起范圍為[第二個結(jié)點,最后一個結(jié)點]更加合理,可以有效處理待刪除元素在鏈表尾部的問題,也能夠避免bug的發(fā)生。
2.使用鏈表時要嚴格檢查有沒有訪問空指針的成員,特別要考慮待刪除元素在鏈表邊界的特殊情況。

ps:如果細心的話可以發(fā)現(xiàn)代碼隨想錄中判斷空指針用的是Null,而我的代碼里用的是nullptr,當時覺得有些疑惑,這里再簡單總結(jié)一下在C++中Null和nullptr的區(qū)別:用Null表示空指針是C語言中遺留下來的傳統(tǒng),但在C++中可能會引起問題,因此在C++11中引入了nullptr表示空指針,如果要在C++中表示空指針,那么使用nullptr而不是Null.。文章來源地址http://www.zghlxwxcb.cn/news/detail-675483.html

到了這里,關于leetcode鏈表題報錯 runtime error: member access within null pointer of type ‘ListNode‘的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • QWidget 報錯 error: no member named ‘XXXX‘ in ‘ui::Widget‘

    QWidget 報錯 error: no member named ‘XXXX‘ in ‘ui::Widget‘

    主要原因是我們在修改完ui界面時沒有重新構建項目或者就是因為構建的項目與原項目不在同一個文件夾下面 1.點擊項目-2.取消勾選shadow build.通過這兩步,我們重建的項目的中間過程文件以及可執(zhí)行文件就會生成在項目的目錄下。 2.但這時可執(zhí)行文件與中間過程文件都在deb

    2024年02月08日
    瀏覽(20)
  • 【算法】鏈表題的常用技巧及算法題(C++)

    【算法】鏈表題的常用技巧及算法題(C++)

    下面的技巧通過一些后面的例題可以較好的理解熟練。 常用技巧 畫圖 鏈表題通過畫圖可以較為直觀分析鏈表,方便分析如何進行對鏈表的操作等 引入虛擬“頭”節(jié)點 虛擬節(jié)點適合處理一些邊界情況 同時放便我們進行對鏈表的操作 多定義變量 多定義變量增強可讀性,也方

    2024年02月03日
    瀏覽(16)
  • Unity 報錯error CS0656: Missing compiler required member ‘Microsoft.CSharp.RuntimeBinder.CSharpArgumen

    Unity 報錯error CS0656: Missing compiler required member ‘Microsoft.CSharp.RuntimeBinder.CSharpArgumen

    error CS0656: Missing compiler required member ‘Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create’ unity報錯及解決方案 今天用了一個開源的項目腳本,放到unity后報錯了,查了資料說是缺Microsoft.CSharp包,添加了引用仍然無效,具體原因是因為腳本中用了dynamic類型。嘗試了一些解決辦法,最

    2024年01月18日
    瀏覽(26)
  • vue報錯Uncaught runtime errors: × ERROR ResizeObserver loop limit exceeded at handleError (webpack

    Uncaught runtime errors: × ERROR ResizeObserver loop limit exceeded at handleError (webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:252:58) at eval (webpack-internal:///./node_modules/webpack-dev-serve 問題原因: 使用了el-table組件+彈性布局 彈性布局 單獨使用都不會報錯,但是兩個結(jié)合在一起就產(chǎn)生了

    2024年02月11日
    瀏覽(22)
  • maven報錯error while loading <root>, Error accessing

    maven報錯error while loading <root>, Error accessing

    [ERROR] error while loading root, Error accessing D:installjavaapache-maven-3.6.3respositoryorgapacheflinkflink-clients_2.111.13-tq-0.1.7flink-clients_2.11-1.13-tq-0.1.7.jar ? Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.4.6:compile (scala-compile-first) on project common-flink: wrap: scala.reflect.internal.MissingRequirementErro

    2024年02月12日
    瀏覽(28)
  • Kubeadm初始化報錯:[ERROR CRI]: container runtime is not running:

    輸入后再次執(zhí)行kubeadm init,正常運行

    2024年02月12日
    瀏覽(28)
  • LeetCode:Line 1037: Char 34: runtime error: addition of unsigned offset to 0x502000000090 overflowed

    錯誤信息 在重刷47.全排列II時,寫了如下代碼: 出現(xiàn)如下錯誤信息: 錯誤定位 通過注釋代碼的方法,定位到錯誤的位置在 dfs 函數(shù)里的 if 判斷: 錯誤原因 當 i 為 0 元素時,會執(zhí)行 nums[i] == nums[i - 1] , i - 1 為負數(shù),作為數(shù)組索引是不合法的,因此會報如上錯誤。換言之,

    2024年03月15日
    瀏覽(19)
  • nvm 安裝 Node 報錯:panic: runtime error: index out of range [3] with length 3

    nvm 安裝 Node 報錯:panic: runtime error: index out of range [3] with length 3

    最近在搞 TypeScript ,然后想著品嘗一下 pnpm ,但是 pnmp 8.x 最低需要 Node 16.x ,但是電腦上暫時還沒有該版本,通過 nvm list available 命令查看可用的 Node 版本: 既然有最高版本,那肯定直接上最高版本: 然后就報錯了,錯誤信息如下: 出問題果斷 Github 上去搜( 體會到了開源

    2024年02月16日
    瀏覽(67)
  • k8s初始化報錯:[ERROR CRI]: container runtime is not running(已解決)

    k8s初始化報錯:[ERROR CRI]: container runtime is not running(已解決)

    如有錯誤,敬請諒解! 此文章僅為本人學習筆記,僅供參考,如有冒犯,請聯(lián)系作者刪除!! ? ? ? ? ?在網(wǎng)上找了好幾天解決方案,大部分都是下述方案: ? ? ? ? 但是當我們嘗試之后仍無法解決問題。 如有錯誤,請聯(lián)系作者刪除 并懇請同行朋友予以斧正,萬分感謝!

    2024年02月07日
    瀏覽(15)
  • docker 啟動容器 報錯 Error response from daemon: failed to create shim task: OCI runtime create failed

    Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: unable to apply apparmor profile: apparmor failed to apply profile: write /proc/self/attr/apparmor/exec: no such file or directory: unknown 解決方案

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包