void pairWiseSwap(struct node *head)
{
// The task is to complete this method
if(!head || (head && head->next==NULL))
return;
if(head->next!=NULL)
{
int tmp = head->next->data;
head->next->data = head->data;
head->data = tmp;
pairWiseSwap(head->next->next);
}
}
成对交换元素。 该代码如何工作? 后向递归调用如何工作?
答案 0 :(得分:0)
该函数的名称表示它交换每对单元格(而不是单元格本身)中的数据。
一个单元格与下一个单元格之间的数据交换非常明显:
int tmp = head->next->data; head->next->data = head->data; head->data = tmp;
反向递归调用如何工作?
通过pairWiseSwap(head->next->next);
进行的呼叫会绕过数据已交换为下一个重做的一对单元。
让我们看一个带有完整代码的示例:
#include <stdio.h>
#include <stdlib.h>
struct node {
struct node * next;
int data;
};
void pairWiseSwap(struct node *head)
{
// The task is to complete this method
if(!head || (head && head->next==NULL))
return;
if(head->next!=NULL)
{
int tmp = head->next->data;
head->next->data = head->data;
head->data = tmp;
pairWiseSwap(head->next->next);
}
}
struct node * mk(int d, struct node * nx)
{
struct node * n = malloc(sizeof(struct node));
if (n != NULL) {
n->data = d;
n->next = nx;
}
return n;
}
void pr(struct node * head)
{
while (head) {
printf("%d ", head->data);
head = head->next;
}
}
int main()
{
struct node * head = mk(0, mk(1, mk(2, mk(3, mk(4, mk(5, NULL))))));
printf("before : ");
pr(head);
pairWiseSwap(head);
printf("\nafter: ");
pr(head);
putchar('\n');
/* free resources */
while (head) {
struct node * n = head->next;
free(head);
head = n;
}
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra h.c
pi@raspberrypi:/tmp $ ./a.out
before : 0 1 2 3 4 5
after: 1 0 3 2 5 4
注意
if(!head || (head && head->next==NULL))
return;
可以只是
if ((head == NULL) || (head->next==NULL))
return;
因为如果 head 在||
的左侧不为空,则再次检查它是否在右侧不为空
如果递归是在head->next
而不是head->next->next
上进行的,则该函数会进行轮换,结果为1 2 3 4 5 0