【问题标题】:In a linked list, to Reach the last node via auxiliary links在链表中,通过辅助链接到达最后一个节点
【发布时间】:2018-08-30 03:49:05
【问题描述】:

我们有一个带有节点结构的链表:-

struct Node {
   Node *next;
   Node *aux;
};

链表结构:-

  1. next 指针始终指向下一个节点,就像在单链表中一样。
  2. aux指针可以指向任意一个节点,可以指向当前节点之前或之后,也可以指向当前节点本身,也可以为NULL。

问题陈述: 对链表中的辅助指针进行最少次修改,使最后一个节点可以通过辅助指针从链表的任何节点到达。例如完成所有修改后,到达最后一个节点的限制是我们只能使用 aux 指针来导航列表。 以下是列表的一种可能表示形式。请注意,此处未表示辅助指针为 NULL。

【问题讨论】:

  • 为什么投票关闭它?这不是一个正确的论坛吗?还是这个问题有缺陷?你需要说明原因!这不是很具有描述性,而是很清晰。
  • @StephenDocy 谢谢你的建议,告诉我什么不清楚?什么是多余的和额外的?它如何不能有效地传达问题陈述。
  • @StephenDocy 不要担心你不能亲手给我代码。顺便说一句,我很久以前就在stackoverflow上,只有当我遇到一些可以在开放论坛上提出的好问题时,我才会在这里问。我没有在这里包含我的解决方案,只是为了避免想要帮助的人的方法偏见。你在这里做的纯属欺凌行为。以前你对我提问的方式有异议,现在你提出了一些其他的问题。如果有人可以评论一个好主意,这对我来说绝对有太大帮助。我不想要任何代码。
  • 虽然人们已经提出了有效的担忧,认为这是非常通用的并且原始海报没有付出任何努力,但我想把我的 2 美分扔给可能的解决方案:1. 如果有任何循环,然后打破它,通过只需将其指向最后一个节点,2.任何节点都将为空,因为 AUX 可以直接指向最后一个节点,3.有点棘手,对其余节点执行 DFS,如果最后一个节点按顺序出现,则什么都不做移动到下一个节点是列表,否则只需在最后中断并将其指向最后指向的先前节点之一。

标签: algorithm data-structures linked-list


【解决方案1】:

首先观察几点:

空辅助指针显然需要修复,所以只需将它们指向末尾即可。

对于其他人,如果您继续跟随指针,它们将到达最后一个节点,因此您无需执行任何操作,或者它们将循环。如果它们循环,则循环上的元素将恰好属于一个循环(因为您有一个辅助指针)。您可以选择循环中的任何元素进行修复(因为它是一个循环,所有其他元素最终都会到达固定元素)。

使辅助指针指向除最后一个元素之外的任何东西是没有意义的。这就是目标,指向其他任何东西都可能引入循环。

所以有了这个想法,算法很简单: 从 int 向量开始,其中所有内容均为 0。您需要一个 id 生成器(只需一个 int 来保持递增,从 1 开始)

  • 遍历向量。

  • 如果条目不为 0,则移动到向量中的下一个条目。

  • 否则从生成器中获取下一个 id(并将其递增 下一次)。用 id 标记向量中的节点并开始 跟随辅助链接。

  • 如果下一个节点是最后一个值,则停止并继续迭代 通过向量。

  • 如果下一个节点的next值为0,则用id和 从那里继续关注辅助链接。

  • 如果下一个值不是 0 并且不是您当前使用的 id (你已经到达了一个你以前见过的节点)然后停止并 继续遍历向量。

  • 如果下一个值是您正在使用的 id,那么您已经找到了一个循环。 修复当前节点的aux指针,继续迭代 向量。

总体而言,此解决方案的复杂度为 O(N),因为您将最多访问每个节点两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多