在链接列表中,通过辅助链接到达最后一个节点

时间:2018-03-21 06:06:42

标签: algorithm data-structures linked-list

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

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

链表的结构: -

  1. 下一个指针总是指向下一个节点,就像在单个链接列表中一样。
  2. aux指针可以指向当前节点之前或之后的任何节点,也可以指向当前节点本身,也可以为NULL。
  3. 问题陈述: 对列表中的辅助指针进行最小次修改,以便可以通过辅助指针从链接列表的任何节点访问最后一个节点。例如完成所有修改后,到达最后一个节点的限制是我们只能使用辅助指针来导航列表。 以下是列表的可能表示之一。请注意,此处未表示辅助指针为NULL。 enter image description here

1 个答案:

答案 0 :(得分:0)

首先观察几点:

空辅助指针显然需要修复,所以只需将它们指向最后。

对于其他人,如果你继续关注指针,他们将会到达最后一个节点,所以你不需要做任何事情,或者他们会循环。如果它们循环,那么循环上的元素将恰好属于一个循环(因为你有一个辅助指针)。你可以选择要修复的循环的任何元素(因为它是一个循环,所有其他元素最终将到达固定元素)。

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

所以有了这个想法,算法很简单: 从int的向量开始,其中一切都是0.你需要一个id-generator(只是一个int来保持递增,从1开始)

  • 遍历向量。

  • 如果条目不为0,请移至向量中的下一个条目。

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

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

  • 如果下一个节点的下一个值为0,请用id和标记它 继续关注那里的辅助链接。

  • 如果下一个值不是0而不是您当前使用的ID (你已经到达了一个你以前见过的节点),然后停下来 继续迭代向量。

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

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