Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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_Algorithm_Data Structures_Linked List - Fatal编程技术网

Java 如果指向链接列表的最后一个节点,请删除该节点

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

我试图删除linkedlist的最后一个节点,因为指针只指向该节点

我编写了下面的实现,但不起作用

我已经访问了关于这个主题的大多数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->


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