如何在没有头指针的情况下找到单链表的前一个节点

时间:2018-02-15 04:27:23

标签: data-structures linked-list nodes

嗨,这是一个面试问题,任何建议/答案都将不胜感激。

在问题中:他给了我一个单独的链表并指出一个随机节点,并让我找到前一个节点。我问我是否可以访问头指针,他说没有。我问它是圆形还是双链表,他再说不。我如何找到上一个节点?

P.S。 - 我根本没有访问头指针,所以我无法跟踪先前的指针。

4 个答案:

答案 0 :(得分:3)

从纯粹的CS角度来看,如果你构建一个长度为n的非循环单链表:

L1 -> L2 -> ... -> L(x-1) -> Lx -> ... -> Ln

以下定理成立:

定理:节点Lx只能由节点L1Lx到达。

仅仅通过观察,这是相当明显的:没有倒退。我跳过了一些步骤,但这是一个相当容易的结论。从Lx到链中的先前节点没有路径。正式证据将使用归纳法。 This page explains如何对链接列表执行归纳。

相反的是:节点L1无法访问节点L(x-1)Lx。作为直接结果,节点L(x-1)无法达到Lx,这与采访者的主张相矛盾。 面试官是错的,或者你对面试官的解释是错误的。

  

我只被给了随机节点,我被要求找到前一个节点,没有头指针,没有循环

如果这样的事情成为可能,它将打破许多现有的计算机科学应用。例如,Python或Ruby等安全语言中的垃圾收集依赖于一旦没有路径就无法再访问节点。如果您能够以这种方式访问​​节点,则可能导致“释放后使用”错误,使语言不安全。

面试官可能希望你说这个问题是不可能的。在这种情况下,我接受过采访。有时,面试官正在探索更具“创造性”的解决方案。例如,在诸如C ++的语言中,所有节点可以存储在底层资源池中,该资源池可以被迭代以找到前一节点。但是,我会发现这种实现在面试和实践中都是不寻常的。

毋庸置疑,在规定的限制条件下,您所说的问题是不可能的。

答案 1 :(得分:0)

您可以执行此操作的唯一方法是,如果链接列表是循环的,即最后一个节点指向第一个节点作为循环列表的类型。然后,它只是一个列表行走,跟踪前一个节点,直到您再次到达您所在的节点。

答案 2 :(得分:0)

有可能。这是供您参考的代码。这里,我假设我知道每个节点的数据值。您可以通过在调用方法中提供“ b”和“ c”来测试此代码。显然,您也可以创建多个对象。让我知道这是否是您要寻找的解决方案。

#程序以删除单个链接列表中的任何一个节点

class A:
    def __init__(self,data):
        self.data=data
        self.node=None

class B:
    def __init__(self):
        self.head=None

    def printlist(self):
        printval=self.head
        c=0
        self.call(printval,c)

    def call(self,printval,c):
        temp1=None
        temp2=None
        while printval:
            if printval.data=='c' and c==0:
                c=c+1
                temp2=printval.node
                del printval
                temp1.node=temp2
                printval=temp1.node
            print(printval.data)
            temp1 = printval
            printval=printval.node


o1=B()
o1.head=A("a")
o2=A("b")
o3=A("c")
o4=A("d")
o1.head.node=o2
o2.node=o3
o3.node=o4
o1.printlist()

答案 3 :(得分:0)

您可以这样操作..您可以将当前节点的值替换为下一个节点的值..在第二个倒数第二个节点的下一个中,可以将null设置为空。就像从字符串中删除元素一样。 这是代码

    void deleteNode(ListNode* node) {
        ListNode *pre=node;
       while(node->next) 
        {
            node->val=node->next->val;
            pre=node;
            node=node->next;
        }
        pre->next=NULL;
    
}