【问题标题】:Delete a last node of linked list given pointer to that node给定指向该节点的指针,删除链表的最后一个节点
【发布时间】:2013-07-09 03:18:51
【问题描述】:

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

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

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

【问题讨论】:

  • 你应该让前一个节点指向空
  • ^ 我没有任何指针,除了指向最后一个节点的指针。所以你的解决方案不起作用
  • 没有适用于单链表的解决方案。请重新检查您的作业...
  • 那我认为这不可能,因为你之前的节点的下一个节点仍然有那个已删除的位置
  • 如果没有指向前一个节点的指针,就不可能删除最后一个节点。我认为您的教授希望您进行此观察。如果您可以访问头指针,那么给定任务是可能的。你可以访问头指针吗?

标签: java algorithm data-structures linked-list


【解决方案1】:

单链表是不可能的。
这是强调数据结构的大人物公司通常会问的面试问题。
问题被表述为“删除单链表中的节点,仅给出指向该节点的指针”
预期解决方案:

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】:

    current = null; 不符合您的预期 - 它仅将局部变量(方法参数)设置为 null

    使用Node 类的当前实现,您想要的是不可能的。 您需要对 Node 类中的前一个节点的引用(即双向链表),或者您必须提供对 deleteNode 方法的某个前一个节点的引用。

    【讨论】:

      【解决方案3】:

      我会说

      可以从链表中删除最后一个节点,如果reference 它的前一个节点是给定的。

      不过,这取决于您实施列表的方式。

      对于您的实施,您不能这样做

      【讨论】:

        【解决方案4】:

        这个问题的唯一解决方案是遍历完整的列表,每次都保持上一个节点指针,比较当前节点和当前节点。当比较通过时,删除最后一个节点,并将prev节点指向null。类似于下面的代码(注意:我没有编译它)

        deleteNode(Node *node){
        if(node){
        currentNode = Head, prevNode = NULL;
        while(currentNode != node){
        prevNode = currentNode;
        currentNode = currentNode -> next;
        }
        delete currentNode;
        prevNode -> next = NULL;
        }
        }
        

        【讨论】:

          【解决方案5】:

          @asifsid88 复制并粘贴了“破解编码”中的解决方案,您应该参考该书以找到更多有趣和具有挑战性的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-15
            • 2012-03-10
            • 1970-01-01
            • 2018-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多