【发布时间】:2014-02-27 19:07:17
【问题描述】:
考虑以下函数:
void CustomAppender(int totalNodesToSkip, int totalNodesToCut);
这里totalNodesToSkip 和totalNodesToCut 都是给定的输入。所以需要从 totalNodesToSkip 编号的节点开始切割长度为 totalNodesToCut 的给定链表的一部分。
考虑以下列表:
List_1:a->b->c->d->e->f->g->h->i->j->k
函数的输入是CustomAppender(2,3)。
那么在第一遍中,列表应该变成:
List_2: a->b->f->g->h->i->j->k->c->d->e.
所以这里 c->d->e 部分移到了尾部。这个过程需要重复,直到我们到达给定列表的末尾。也就是说,当我们到达列表 1 的节点“k”时,我们需要停止。
解决这个问题的简单方法是根据给定的输入取要切割的部分: 在 *Marker 中保持一个标记到终点“k”。
*startPTR 指向节点 c.
*endPTR 指向节点 e。 (两者都可以使用给定的输入进行迭代。)
点 b 节点下一个作为 endPTR 的下一个。
'k' 节点的下一个指向 startPTR。
最后 endPTR 指向 NULL。
可以重复上述步骤,直到到达标记。
这工作正常。
但我的问题是无论如何以任何不同的方式实现它,以便我使用更少的指针和更快的方法。由于此过程需要 O(n^2) 运行时间。
请建议任何其他方式。
【问题讨论】:
标签: c algorithm data-structures linked-list