我在这里有解决方案代码:
// Pre-condition: The fronts of two linked lists are provided.
// Post-condition: A linked list is returned that is the result of
// interleaving the elements from each provided list.
// (e.g. {1, 2, 3} & { 4, 5, 6} would return {1, 4, 2, 5, 3, 6}
Node* interleave( Node*& front1, Node*& front2 ) {
if( !front1 ) return front2;
if( !front2 ) return front1;
Node* third = front1->next; //this will become the third element
Node* fourth = front2->next; // this will be come the fourth element
front1->next = front2;
front2->next = third;
third = interleave(third, fourth);
return front1;
}
我有点理解它,但我永远无法想出这样的东西,因为我在递归方面非常糟糕。还有其他方法可以非递归地解决这个问题吗?如果是这样你能给我一个暗示吗?我试过这个:
Node* interleave( Node*& front1, Node*& front2 ) {
Node* newNode = new Node;
while(front1!=NULL && front2!=NULL){
newNode = front1->next;
newNode = front2->next;
front1 = front1->next;
front2 = front2->next;
}
return newNode;
}
我确定这是错的,但这是我现在唯一能想到的。请帮忙。谢谢
答案 0 :(得分:2)
尝试在一张纸上并行绘制两个链接列表。在节点中放一些数字,只是为了区分它们。考虑如何重新连接它们以形成单个列表,从头部(或“前部”)开始并向下工作。请注意,您必须跟踪一些特殊节点,例如结果列表的第一个节点以及其他几个节点。模式应该变得清晰。
(请注意,无需使用new
构建新节点。)
答案 1 :(得分:1)
您的代码中存在一些错误:
Node* interleave( Node*& front1, Node*& front2 )
我没有看到需要引用指针,因为front1中的第一项将继续作为第一项,而你根本不需要使用front2。
Node* newNode = new Node;
while(front1!=NULL && front2!=NULL){
newNode = front1->next;
这导致内存泄漏 - 你至少分配了sizeof(Node)字节,但是你失去了对指针的引用,你将无法再删除它。 此外,你没有对newNode做任何事情,所以你也可以把它扔掉。
front1 = front1->next;
front2 = front2->next;
基本上你告诉front1将指向下一个元素,并且因为你传递了对front1的引用,你正在改变真正的指针。最终,front1或front2将为NULL并且循环将终止,因此两个给定参数中的至少一个将变得无用。你永远不会改变,所以订单将保持不变 - 你只是走过列表。
一种方法可能是将front2的值设置为front1-> next,然后交换指针并再次迭代:
Node *a = front1, *b = front2;
while (a && b) {
Node* tmp = a->next;
a->next = b;
b = tmp;
a = a->next;
}
return front1;
我没有测试过,但应该接近工作。如果你正在使用stl,你可以用std :: swap()替换详细的交换代码。 这个想法很简单:假设你有两个列表:
A - > B - > C - > NULL
D - > E - > F - > NULL
你说A的下一个项目将是第二个列表中的第一个元素,所以D:
A - > D - > E - > F - > NULL
然后第二个列表成为古代A的继承者,所以只有B - > C - >空值。然后你前进到指向新的下一个,或者D,所以你现在有:
D - > E - > F - > NULL
B - > C - > NULL
你重复一遍:
D - > B - > C - > NULL
E - > F - > NULL
B - > C - > NULL
F - > NULL
等等,直到满足NULL。那么仍然指向A的front1应该有正确的顺序(也就是说,除非我非常错误:p)