Java:从链表中删除节点

时间:2018-07-29 16:23:51

标签: java linked-list java.util.scanner nodes singly-linked-list

我正在尝试删除Java中链表中的节点,但是在尝试使用deletenode()方法时,我一直收到NullPointerException。

I get the following error trace:
Exception in thread "main" java.lang.NullPointerException
at 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: 1
BUILD 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();
        }
    }
}

4 个答案:

答案 0 :(得分:0)

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
}

答案 1 :(得分:0)

在您的方法中,要删除的节点是trace.next(您将其称为del)。这意味着trace的{​​{1}}指针需要更新为next,有效地“跳过”要删除的节点(trace.next.next)。看起来像:trace.next

您正在做的是通过将trace.next = trace.next.next本身设置为trace来对其进行修改。我知道这是为了使迭代正常工作,但是要弄乱其余的代码,因为您丢失了指向需要更新的节点的指针。如果我们修改trace.next.next,则循环将在结束时运行trace.next时妥善处理指针。

在Java对象中,不再有指向它的引用从计算机的内存中删除-此过程称为垃圾收集。由于此时我们已经修改了trace = trace.next,因此除了您创建的trace.next变量之外,没有其他要删除的节点的引用。一旦该变量在此函数结束时超出范围,该节点将被垃圾回收,您无需执行任何其他操作。您甚至根本不需要del变量。一旦我们通过更新(跳过)而失去了对旧del的引用,对该Node的引用将不再存在,垃圾收集器将其剔除。

考虑到所有这些,您的代码就变成:

trace.next

答案 2 :(得分:0)

不要声明临时字段:请改用局部变量:

public Node insertnode(int data) {

    if(head == null) {
        head = new Node(data);
    } else {
        Node temp = new Node(data);
        temp.next = head;
        head = temp;
    }
    return head;
}

要回答您的问题,请测试trace是否不为null,然后尝试在不测试trace.next的情况下访问trace.next.data。

尝试这样的事情:

public void deletenode(int data) {

    Node prev = null;

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

        if(trace.data == data) {
            if (prev == null) {
                head = trace.next;
            } else {
                prev.next = trace.next;
            }
        } else {
            prev = trace;
        }
    }
}

答案 3 :(得分:0)

我认为您解决问题的方法是错误的。请找到处理链表问题的适当方法。

LinkedListNode类:

class LinkedListNode {
    int data;
    LinkedListNode next;
    LinkedListNode(int data) {
        this.data= data;
        this.next=null;
    }
}

开始时插入:

 LinkedListNode insertNodeAtBegining(LinkedListNode head, int val) {
        LinkedListNode temp= head;
        head= new LinkedListNode(val);
        head.next=temp;
        return head;
    }

删除节点:

LinkedListNode deleteNode(LinkedListNode head, LinkedListNode node) {
    if(head==null) {
        return head;
    }
    if(head.data==node.data) {
        return head.next;
    }

    LinkedListNode temp=head;
    while(temp.next!=null) {
        if(temp.next.data==node.data) {
            temp.next=temp.next.next;
        }
        temp=temp.next;
    }
    return head;
}