我们有一个带有节点结构的链表: -
struct Node {
Node *next;
Node *aux;
};
链表的结构: -
答案 0 :(得分:0)
首先观察几点:
空辅助指针显然需要修复,所以只需将它们指向最后。
对于其他人,如果你继续关注指针,他们将会到达最后一个节点,所以你不需要做任何事情,或者他们会循环。如果它们循环,那么循环上的元素将恰好属于一个循环(因为你有一个辅助指针)。你可以选择要修复的循环的任何元素(因为它是一个循环,所有其他元素最终将到达固定元素)。
使辅助指针指向除最后一个元素之外的任何内容都没有意义。这就是目标,指向其他任何可能引入循环的东西。
所以有了这个想法,算法很简单: 从int的向量开始,其中一切都是0.你需要一个id-generator(只是一个int来保持递增,从1开始)
遍历向量。
如果条目不为0,请移至向量中的下一个条目。
否则从生成器获取下一个id(并将其递增为 下一次)。使用id标记向量中的节点并开始 跟随辅助链接。
如果下一个节点是最后一个值,则停止并继续迭代 通过矢量。
如果下一个节点的下一个值为0,请用id和标记它 继续关注那里的辅助链接。
如果下一个值不是0而不是您当前使用的ID (你已经到达了一个你以前见过的节点),然后停下来 继续迭代向量。
如果下一个值是您正在使用的ID,那么您已找到一个循环。 修复当前节点的aux指针并继续迭代 向量。
总体而言,此解决方案的复杂度为O(N),因为您最多访问每个节点两次。