嗨,这是一个面试问题,任何建议/答案都将不胜感激。
在问题中:他给了我一个单独的链表并指出一个随机节点,并让我找到前一个节点。我问我是否可以访问头指针,他说没有。我问它是圆形还是双链表,他再说不。我如何找到上一个节点?
P.S。 - 我根本没有访问头指针,所以我无法跟踪先前的指针。
答案 0 :(得分:3)
从纯粹的CS角度来看,如果你构建一个长度为n
的非循环单链表:
L1 -> L2 -> ... -> L(x-1) -> Lx -> ... -> Ln
以下定理成立:
定理:节点Lx
只能由节点L1
到Lx
到达。
仅仅通过观察,这是相当明显的:没有倒退。我跳过了一些步骤,但这是一个相当容易的结论。从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;
}