亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java:從鏈表中刪除節點

Java:從鏈表中刪除節點

慕哥9229398 2021-06-11 14:04:08
我正在嘗試在 java 中刪除鏈表中的節點,但是在嘗試使用我的 deletenode() 方法時,我不斷收到 NullPointerException。I get the following error trace:Exception in thread "main" java.lang.NullPointerExceptionat linkedlist.LinkedList.deletenode(LinkedList.java:44)at linkedlist.LinkedList.main(LinkedList.java:69)/Users/carsongedeus/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1BUILD FAILED (total time: 3 seconds)package linkedlist;import java.util.Scanner;/** * * @author carsongedeus */class Node {    int data;    Node next;    Node(int data) {        this.data = data;    }}public class LinkedList {    Node head;    Node temp;在列表的頭部插入。    public Node insertnode(int data) {        if(head == null) {            head = new Node(data);        } else {            temp = new Node(data);            temp.next = head;            head = temp;        }        return head;    }在用戶在鏈表的節點內輸入指定整數后,Delete 方法給出 NULLPointerException。    public void deletenode(int data) {        Node trace;        Node del;        for(trace = head; trace != null; trace = trace.next) {            if(trace.next.data == data) {                del = trace.next;                trace = trace.next.next;                del.next = null;            }        }    }打印機    public void printer() {        System.out.println(head.data);    }    public static void main(String[] args) {        LinkedList linkedlist = new LinkedList();        Scanner scan = new Scanner(System.in);        int n;        for(int i = 0; i < (n = (int)(Math.random()*100+1)); i++) {            linkedlist.insertnode((int)(Math.random()*100+1));            linkedlist.printer();        }        System.out.println("Delete something: ");        int input = scan.nextInt();        linkedlist.deletenode(input);        for(int j = 0; j < n; j++) {            linkedlist.printer();        }    }}
查看完整描述

3 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

在您的方法中,要刪除的節點是trace.next(您將其稱為del)。這意味著需要將thattrace的next指針更新為trace.next.next,從而有效地“跳過”要刪除的節點 ( trace.next)。這看起來像:trace.next = trace.next.next


相反,您正在做的是trace通過將其設置為trace.next.next. 我知道這是為了使迭代正常工作,但會弄亂您的其余代碼,因為您丟失了指向需要更新的節點的指針。如果我們修改trace.next,循環將trace = trace.next在結束運行時處理正確推進指針。


在 Java 中,不再有指向它的引用的對象會從計算機內存中刪除——這個過程稱為垃圾收集。由于此時我們已經進行了修改trace.next,因此沒有對要刪除的節點的進一步引用,以保留del您創建的變量。一旦該變量在此函數結束時超出范圍,該節點將被垃圾收集,您無需采取進一步行動。你甚至根本不需要 del 變量;一旦我們trace.next通過更新(跳過)舊節點而丟失了對舊節點的引用,就不會再存在對該節點的引用,垃圾收集器將剔除它。


考慮到所有這些,您的代碼就變成了:


public void deletenode(int data) {


    Node trace;


    for(trace = head; trace != null; trace = trace.next) {


        if(trace.next.data == data) {

            trace.next = trace.next.next;

        }

    }

}


查看完整回答
反對 回復 2021-06-17
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

public void deletenode(int data) {

    if (head != null && head.data == data) {

        head = head.next; // delete head

        return;

    }

    Node prev = null;

    Node cur = head;

    while (cur != null && cur.data != data) {

        prev = cur;

        cur = cur.next;

    }

    prev.next = cur.next; // delete cur

}


查看完整回答
反對 回復 2021-06-17
  • 3 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號