【发布时间】:2019-03-03 15:23:34
【问题描述】:
给定一个列表,我想通过将第一个与最后一个交换,第二个与倒数第二个交换,以此类推。
我编写了这个函数来交换每一对,其中pos1 和pos2 是要交换的两个位置。
maxPos 是两个位置中最大的一个,
node1 和node2 是遍历列表后找到的两个节点。
int swap(struct node *list, int pos1, int pos2) {
if (node1 != NULL && node2 != NULL) {
if (prev1 != NULL)
prev1->next = node2;
if (prev2 != NULL)
prev2->next = node1;
temp = node1->next;
node1->next = node2->next;
node2->next = temp;
if (prev1 == NULL)
head = node2;
else if (prev2 == NULL)
head = node1;
}
return 1;
}
而不是为每一对递归地调用它,即。 (1,n-1), (2,n-2), (3,n-3) 每次都要遍历列表,想知道有没有办法迭代解决。
【问题讨论】:
-
请为递归工作的代码创建一个minimal reproducible example,为询问替代解决方案提供基础。照原样,您的程序中没有足够的关于几个细节的信息。例如。类型定义。
-
@Yunnosch 我已经尽可能地清理它以使其可读。谢谢。
-
@Fredrik,我不确定在这种情况下如何使用 for 循环。喜欢第一个和最后一个元素?
-
calling this recursively for each pair, ie. (1,n-1), (2,n-2), (3,n-3)通常不被称为递归。递归可能会记住外部节点,将自身应用于没有这些节点的列表,并在最后一个节点之前添加第一个节点作为其结果。但是:鉴于是一个很好的迭代过程来反转单链表,为什么创建一个劣质递归的? -
@Fredrik 说头部被写为 void **head 并且内存已被分配 for 循环会是什么样子?
标签: c pointers recursion linked-list iterator