-1

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

// 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;
}

我以为 if (delNode.next== null) {delNode = null} 会这样做吗?

4

2 回答 2

1

您当前的删除操作通过将下一个节点复制到当前节点然后删除下一个节点来有效地工作,使其看起来像您删除了当前节点。这很好,直到没有下一个节点,正如您所发现的那样。

以下原因不起作用

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

是 delNode 只是一个局部变量,将 delNode 设置为 null 不会影响 delete() 之外的任何内容。

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

删除(数据)的伪代码应该是(未经测试):

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
于 2013-05-07T05:26:54.977 回答
1

如果你想删除一个节点,你应该在你想删除的那个节点之前有一个节点的引用,比如说beforeNode,并设置

beforeNode.next = beforeNode.next.next;

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

参见Java Linked List 搜索和删除方法

请注意,在序列中

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

第一行没用。

于 2013-05-07T05:15:16.143 回答