Java 如果指向链接列表的最后一个节点,请删除该节点
我试图删除linkedlist的最后一个节点,因为指针只指向该节点 我编写了下面的实现,但不起作用 我已经访问了关于这个主题的大多数SO问题,但没有一个显示如何删除链表的最后一个节点,如果只有一个指向该节点的指针 我有什么遗漏吗Java 如果指向链接列表的最后一个节点,请删除该节点,java,algorithm,data-structures,linked-list,Java,Algorithm,Data Structures,Linked List,我试图删除linkedlist的最后一个节点,因为指针只指向该节点 我编写了下面的实现,但不起作用 我已经访问了关于这个主题的大多数SO问题,但没有一个显示如何删除链表的最后一个节点,如果只有一个指向该节点的指针 我有什么遗漏吗 class Node { Node next; int value; Node(int val) { this.value = val; this.nex
class Node {
Node next;
int value;
Node(int val) {
this.value = val;
this.next = null;
}
@Override
public String toString() {
Node cur = this;
String str = "";
while(cur != null) {
str += cur.value+"->";
cur = cur.next;
}
return str;
}
}
class DeleteNodeLL {
public static void deleteNode(Node current) {
Node temp;
if(current.next == null) {
current = null;
return;
} else {
current.value = current.next.value;
temp = current.next;
temp = null;
current.next = current.next.next;
}
}
public static void main(String [] args) {
Node n1 = new Node(25);
Node n2 = new Node(1);
Node n3 = new Node(36);
Node n4 = new Node(9);
Node n5 = new Node(14);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = null;
System.out.println("Original linkedlist :");
System.out.println(n1);
System.out.println();
System.out.println("After deleting a node :");
deleteNode(n5);
System.out.println(n1);
}
}
输出:-
原始链接列表:25->1->36->9->14-> 删除节点后:
25->1->36->9->14->
current=null
没有达到预期效果-它只将局部变量(方法参数)设置为null
对于当前的节点实现
类,您所需要的是不可能的。
您需要引用
节点
类中的前一个节点(即双链接列表),或者必须提供对删除节点
方法中某个前一个节点的引用 使用单链表是不可能的。这是在强调数据结构的大公司中通常提出的面试问题。
该问题表述为“如果指针仅指向该节点,则删除单链表中的节点”
预期解决方案:
public void deleteNode(Node n)
{
if(n==null || n.next==null)
{
System.out.println("Delete not possible");
return;
}
n.data = n.next.data;
Node tmp = n.next;
n.next = n.next.next;
tmp.next = null;
System.out.println("Node Deleted");
}
其思想是将数据从下一个节点复制到当前节点并删除下一个节点。如果该节点是最后一个节点,则解决方案不起作用(这是候选人在面试中必须辩论和指出的问题)
希望它能帮助你!(你的问题的解决方案是一个骗人的问题,它并不存在)我想说
如果引用为,则可以从链接列表中删除最后一个节点
它的上一个节点已给定
但是,这取决于您如何实现列表
对于您的实现,您不能这样做
这个问题的唯一解决方案是每次迭代完整的列表,保持prev节点指针,比较当前节点和当前节点。当比较通过时,删除最后一个节点,并将prev节点指向null。类似下面的代码(注意:我没有编译它)
@asifsid88复制并粘贴了“破解编码”中的解决方案,您应该参考这本书找到更有趣和更具挑战性的问题。您应该将上一个节点指向null^我没有任何指针,除了指向最后一个节点的指针。所以您的解决方案不起作用没有一个解决方案适用于单链表。请重新检查您的作业…然后我认为这是不可能的,因为您上一个节点的下一个节点仍然具有已删除的位置,如果没有指向上一个节点的指针,则无法删除最后一个节点。我认为您的教授希望您进行此观察。如果您可以访问头指针,那么给定的任务是可能的。您有权访问头指针吗?
deleteNode(Node *node){
if(node){
currentNode = Head, prevNode = NULL;
while(currentNode != node){
prevNode = currentNode;
currentNode = currentNode -> next;
}
delete currentNode;
prevNode -> next = NULL;
}
}