我无法让我的程序删除链表中的最后一个节点或唯一节点。它将删除任何其他节点。这个程序允许用户输入整数并删除它们。提前感谢你的帮助。
// 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;
(考虑特殊情况,如删除最后一个元素)
参见Java链表查找和删除方法
请注意在
序列中 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()之外的任何内容。
如果要从列表中删除最后一个节点,则需要将倒数第二个元素中的next指针设置为null。因此,find()仅仅返回您希望删除的元素是不够的——您需要前面的元素。
delete(data)的伪代码应该是(未经测试):
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