Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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,我无法让程序删除链接列表中的最后一个节点或唯一节点。它将删除任何其他节点。此程序允许用户输入整数并删除它们。提前感谢你的帮助 // This method finds the value requested in the Linked List. public Node find(Node head, Comparable value2){ if (head == null ) { System.out.println("The list is

我无法让程序删除链接列表中的最后一个节点或唯一节点。它将删除任何其他节点。此程序允许用户输入整数并删除它们。提前感谢你的帮助

// This method finds the value requested in the Linked List.

public Node find(Node head, Comparable value2){
    if (head == null ) 
        {
            System.out.println("The list is empty");
            return null;
        }

    Node pointer = head;
        while (pointer != null)
        {
            if (pointer.data.compareTo(value2)>=0)
                {
                    Node delNode = pointer;
                    System.out.print("Found it. Deleting " + delNode.data + "\n");
                    return delNode;

                }
            pointer = pointer.next;
        }

        return null;    
}



// This method deletes a given value from the linked list. 

public void delete(Node head, Comparable value2){
     Node delNode;
     delNode = find(head, value2);
     if (delNode== null)
     {
         System.out.println("The value: " + value2 + " does not exist");
         print(head);

     }

     else
         {
         if (delNode.next == null)
         {
             System.out.println("Trying to delete last");
             delNode = null;
             print(head);
         }
         else{
             delNode.data = delNode.next.data;
             Node temp = delNode.next.next;
             delNode.next = null;
             delNode.next = temp;   
             print(head);
         }        
         }    
     return;
}

我想如果(delNode.next==null){delNode=null}就可以了

如果要删除节点,应在要删除的节点之前有一个对该节点的引用,例如
beforeNode
,并设置

beforeNode.next = beforeNode.next.next;
(考虑特殊情况,例如删除最后一个元素。)

请注意,在序列中

         delNode.next = null;
         delNode.next = temp;   

第一行没有用。

当前删除操作的有效方法是将下一个节点复制到当前节点,然后删除下一个节点,使其看起来像是删除了当前节点。正如您所发现的,在没有下一个节点之前,这是正常的

以下内容不起作用的原因

     if (delNode.next == null)
     {
         System.out.println("Trying to delete last");
         delNode = null;
         print(head);
     }
delNode只是一个局部变量,将delNode设置为null不会影响delete()之外的任何内容

如果要从列表中删除最后一个节点,则需要将最后一个元素中的下一个指针设置为null。因此,find()仅返回要删除的元素是不够的——您需要前面的元素

删除(数据)的伪代码应为(未测试):


我担心您在这里遇到了一些通过引用/通过值传递的问题。你期待什么样的行为你没有看到,或者你遇到了什么意想不到的行为?在这种情况下,您希望“删除”如何工作?
delNode
是一个局部变量。您可以为其指定所需的内容,这不会影响对象的状态。您可能想更新一些字段。它是单链表吗?find方法每次都会找到要删除的正确节点。方法delete将只删除不是第一个或最后一个节点的节点,即使find正确标识了该节点。在只剩下一个节点的情况下,find将返回正确的节点,并且我不能在之前设置一个。如果(delNode.next==null){System.out.println(“尝试删除最后一个”);delNode=null;print(head);}//delNode=null应仅将剩余节点设置为null?因为您可能已将
find
方法修改为
findTheNodeBefore
语义,此方法执行一项特殊任务,您可能在其他任何地方都无法执行。我建议将这两种方法(
find
aka
findTheNodeBefore
delete
)合并为一种。我想新方法不会比您的单个方法长-这是因为当前执行了两次
null
检查。您最好用它更改代码的最后一行:
Node delNode=previous.next;previous.next=previous.next.next;delNode.next=null;delNode=null以避免内存泄漏。不,没有任何内存泄漏。是的,删除的节点没有引用它,但是出于这个原因,垃圾收集器将清理它。被删除的节点没有必要引用任何内容,因为它有资格进行垃圾收集。谢谢
if head == null
    return
if head.data == data
    head = head.next
    return
previous = find_previous(data)
if previous == null
    return
previous.next = previous.next.next