给定指向该节点的指针,删除链表的最后一个节点

时间:2013-07-09 03:18:52

标签: java algorithm data-structures linked-list

我正在尝试删除链表的最后一个节点,只给指向该节点的指针。

我写了下面的实现,但是没有用。

我已经访问过有关此主题的大多数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->

5 个答案:

答案 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复制并粘贴来自"破解编码的解决方案",你应该参考那本书来寻找更有趣和更具挑战性的问题。