给定节点如何在单链表中找到先前的节点

Dav*_*run 4 c java linked-list list data-structures

给定当前节点,如何在单链接列表中找到其先前节点.谢谢.逻辑将做,代码表示赞赏.我们都知道给定一个根节点可以进行顺序遍历,我想知道是否有一种更智能的方法可以避免顺序访问开销.(假设没有访问根节点)谢谢.

小智 12

如果要删除当前节点,也可以在不查找前一个节点的情况下执行此操作。

Python代码:

def deleteNode(自身, 节点):

node.val = node.next.val

node.next = node.next.next
Run Code Online (Sandbox Code Playgroud)

@删除链表中的节点

  • 这应该是公认的答案。其他人似乎都忘记了头是不可访问的,只给出了一个节点。但是,这里需要注意一件事,如果给定节点是单链表的尾部,则该解决方案将不起作用。 (4认同)

Hen*_*olm 7

从头开始遍历列表,直到遇到一个节点,该节点的next链接指向您当前的节点。

但是如果你需要这样做,也许你一开始就不应该使用单向链表。


fil*_*fku 6

单向链表的唯一选择是线性搜索,如下所示(类似 Python 的伪代码):

find_previous_node(list, node):
   current_node = list.first
   while(current_node.next != null):
       if(current_node.next == node):
          return current_node
       else:
          current_node = current_node.next
   return null
Run Code Online (Sandbox Code Playgroud)


hem*_*lit 6

你不能.

根据定义,单链接列表仅将每个节点链接到其后继节点,而不是前导节点.没有关于前任的信息; 甚至没有关于它是否存在的信息(你的节点可能是列表的头部).

您可以使用双向链表.您可以尝试重新排列所有内容,这样您就可以将前一个作为参数传入.

您可以扫描整个堆,查找看起来像具有指向节点的指针的前置节点的记录.(不是一个严肃的建议.)

  • 你为什么说“你不能”?从列表的开头迭代搜索“next”等于“current”的节点有什么问题。如果没有找到匹配,返回 `NULL` 或类似的东西?? (3认同)
  • @hemflit:我发现很难相信有人有一个(非伪造的)链表容器不允许访问列表头。这样的容器有什么意义?您只能将项目推送到列表中,但永远无法迭代它们...... (2认同)