我正在尝试理解链接列表,但我陷入了以下递归解决方案。设a = {1,2,3},b = {4,5,6}。用笔和纸,我已达到重复指针。当recur等于NULL时,我开始继续,但是当我来到b -> next = recur;
的行时,我感到困惑。因为recur的先前值是NULL
,但是如果它是NULL
,则意味着函数在那里结束但是它不是递归函数。如果我需要去那条recur = ShuffleMerge(a->next, b->next);
的那一行,情况会变得更糟。因为a -> next = NULL
和b -> next = NULL
,因为当我们第一次计算复现时,a是3而b是6,所以我不明白这段代码是如何工作的,但即使我用gdb检查过,它也表明结果是前3然后是2,最后是1.但我真的不明白那个解决方案。我需要一些帮助!提前谢谢。
struct node* ShuffleMerge(struct node* a, struct node* b) {
struct node* result;
struct node* recur;
if (a==NULL) return(b); // see if either list is empty
else if (b==NULL) return(a);
else {
// it turns out to be convenient to do the recursive call first --
// otherwise a->next and b->next need temporary storage.
recur = ShuffleMerge(a->next, b->next);
result = a; // one node from a
a->next = b; // one from b
b->next = recur; // then the rest
return(result);
}
}