Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除节点时出现问题_Java_Linked List - Fatal编程技术网

Java 删除节点时出现问题

Java 删除节点时出现问题,java,linked-list,Java,Linked List,我正在处理一个链接列表,目前无法通过键值删除特定节点。我问学校的一个帮手,他不知道为什么它不起作用。(还有很多关于另一个问题的尝试,我为它看起来有多恶心而道歉) 以下是我的删除方法: public void remove(int key) throws Exception { Node tmp = first; Node pred = first; while (tmp != null) { if (tmp.keyValu

我正在处理一个链接列表,目前无法通过键值删除特定节点。我问学校的一个帮手,他不知道为什么它不起作用。(还有很多关于另一个问题的尝试,我为它看起来有多恶心而道歉)

以下是我的删除方法:

public void remove(int key) throws Exception {
        Node tmp = first;
        Node pred = first;

        while (tmp != null) {
            if (tmp.keyValue == key) {
                pred = tmp;
                tmp = tmp.next;

            } else {
                tmp = tmp.next;
            }

        }
以下是我创建列表并尝试将其删除并打印的主要方法:

OrderedLinkedList oLL3 = new OrderedLinkedList();
        try {
            oLL3.insert("Should be removed", 5);
            oLL3.insert("Shouldn't be removed 2nd", 15);
            oLL3.insert("Shouldn't be removed", 10);
        } catch (Exception e) {
            System.out.println("Error: Two nodes with the same key value and the newest one won't be stored.");
        }
        try {
            oLL3.remove(5);
        } catch (Exception r) {
            System.out.println("Error:No nod with the key value to be removed");
        }
        System.out.print("toString test removing node: \n" + oLL3.toString());

        System.out.println("Number of nodes in the List:" + oLL3.listCount());


        }

您的
remove
方法仅分配给局部变量。这不会影响链接列表中的状态。假设列表的标题是由字段
first
持有的节点,则需要分配给另一个节点中的
first
.next
字段

要删除第一个节点,可以执行以下操作:

first = first.next;
prev.next = prev.next.next;
要在节点
prev
之后删除节点,可以执行以下操作:

first = first.next;
prev.next = prev.next.next;

(适当时进行空检查)

在此代码中,您正在删除链表的第一个节点,要删除第一个节点,您需要将“头”(或头节点的名称)指向第二个节点,即

head = head.next;

我的tmp和pred节点变量在remove方法中分配给first。或者你是说别的什么?它们是局部变量。分配给它们不会影响它们所属的方法之外的任何东西。所以你是说,我应该首先分配给非局部变量的对象,而不是先分配给方法中的局部对象?(除了first之外,我也不允许创建任何成员变量。)您所做的是将某些内容设置为
first
。您没有做的是先将
设置为其他任何设置。因此,如果我只是将该节点更改为列表中的不同节点,则可以使用当前代码删除该节点?tmp(当前)和pred(前置)设置为first,这是一个成员变量。