我正在尝试删除链表的最后一个节点,只给指向该节点的指针。
我写了下面的实现,但是没有用。
我已经访问过有关此主题的大多数SO问题,但是如果只有一个指向该节点的指针,它们都没有显示如何删除链表的最后一个节点?
我在这里遗漏了什么吗?
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->
答案 0 :(得分:3)
current = null;
没有达到预期效果 - 它只将局部变量(方法参数)设置为null
。
使用Node
类的当前实现,你想要的是什么是不可能的。
您需要引用Node
类中的前一个节点(即双向链接列表),或者您必须提供对deleteNode
方法的某个先前节点的引用。
答案 1 :(得分:3)
使用单链表是不可能的。
这是面试问题,通常在Big Shot公司提出,强调数据结构
该问题被表述为"删除单个链表中的节点,只给出指向该节点的指针"
预期的解决方案:
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");
}
想法是将数据从下一个节点复制到当前节点并删除下一个节点。如果节点是最后一个节点,则该解决方案不起作用(这是候选人必须辩论并在访谈中指出的内容)
希望它对你有所帮助! (你的问题的解决方案是一个棘手的问题,它不存在)
答案 2 :(得分:0)
我会说
如果引用,可以从链接列表中删除最后一个节点 它是先前的节点。
然而,这取决于您如何实施清单。
对于您的实施,您不能那样做
答案 3 :(得分:0)
此问题的唯一解决方案是迭代完整列表,每次都保留prev节点指针,将当前节点与当前节点进行比较。比较通过时,删除最后一个节点,并将prev节点指向null。类似下面的代码(注意:我没有编译它)
deleteNode(Node *node){
if(node){
currentNode = Head, prevNode = NULL;
while(currentNode != node){
prevNode = currentNode;
currentNode = currentNode -> next;
}
delete currentNode;
prevNode -> next = NULL;
}
}
答案 4 :(得分:0)
@ asifsid88复制并粘贴来自"破解编码的解决方案",你应该参考那本书来寻找更有趣和更具挑战性的问题。