链表拆分为奇偶时如何"delete"原始链表?
How to "delete" original linked list when splitting the linked list into odd and even?
这是我使用的原始代码:
void split(Node*& in, Node*& odds, Node*& evens)
{
/* Add code here */
if (!in)
{
odds = NULL;
evens = NULL;
return;
}
else if (in->value % 2 == 1)
{
odds = in;
return split(in->next, odds->next, evens);
}
else
{
evens = in;
return split(in->next, odds, evens->next);
}
}
我需要删除原来的链表,同时将值转移到新的链表中。根据问题,我必须像以前一样使用递归。如果我现在打印它,那么它会选择第一个节点并打印与该节点关联的链表。
例如,对于下面给出的测试代码,我得到
18 3 5 6 8 9
18 6 8
3 5 9
18 6 8
作为输出,而我需要这个:
18 3 5 6 8 9
3 5 9
18 6 8
这里是测试代码:
void printList(Node* n)
{
while (n != NULL) {
cout << n->value << " ";
n = n->next;
}
cout << "\n";
}
int main()
{
Node* odds = NULL;
Node* evens = NULL;
Node* in = new Node{ 18, new Node{3, new Node{5, new Node{6, new Node{8, new Node{9, NULL} } } } } };
printList(in);
split(in, odds, evens);
printList(in);
printList(odds);
printList(evens);
return 0;
}
您可以移动 节点到一个或另一个列表,方法是擦除原始列表中的指针:
不是一个完美但有效的解决方案(如果您想要 运行 在编译器中查看它是如何工作的,则添加打印以供说明)
void split(Node*& in, Node*& odds, Node*& evens)
{
Node* temp = in;
if(!in) {
//std::cout << "\n";
return;
}
in = nullptr;
if(temp->value % 2 == 1) {
//std::cout << "odd ";
odds = temp;
return split( temp->next, odds->next, evens);
} else {
//std::cout << "even ";
evens = temp;
return split( temp->next, odds, evens->next);
}
}
通过使用静态(不是“堆栈”)时间,它的足迹可能不会增长:
static Node* temp;
temp = in;
这是我使用的原始代码:
void split(Node*& in, Node*& odds, Node*& evens)
{
/* Add code here */
if (!in)
{
odds = NULL;
evens = NULL;
return;
}
else if (in->value % 2 == 1)
{
odds = in;
return split(in->next, odds->next, evens);
}
else
{
evens = in;
return split(in->next, odds, evens->next);
}
}
我需要删除原来的链表,同时将值转移到新的链表中。根据问题,我必须像以前一样使用递归。如果我现在打印它,那么它会选择第一个节点并打印与该节点关联的链表。 例如,对于下面给出的测试代码,我得到
18 3 5 6 8 9
18 6 8
3 5 9
18 6 8
作为输出,而我需要这个:
18 3 5 6 8 9
3 5 9
18 6 8
这里是测试代码:
void printList(Node* n)
{
while (n != NULL) {
cout << n->value << " ";
n = n->next;
}
cout << "\n";
}
int main()
{
Node* odds = NULL;
Node* evens = NULL;
Node* in = new Node{ 18, new Node{3, new Node{5, new Node{6, new Node{8, new Node{9, NULL} } } } } };
printList(in);
split(in, odds, evens);
printList(in);
printList(odds);
printList(evens);
return 0;
}
您可以移动 节点到一个或另一个列表,方法是擦除原始列表中的指针: 不是一个完美但有效的解决方案(如果您想要 运行 在编译器中查看它是如何工作的,则添加打印以供说明)
void split(Node*& in, Node*& odds, Node*& evens)
{
Node* temp = in;
if(!in) {
//std::cout << "\n";
return;
}
in = nullptr;
if(temp->value % 2 == 1) {
//std::cout << "odd ";
odds = temp;
return split( temp->next, odds->next, evens);
} else {
//std::cout << "even ";
evens = temp;
return split( temp->next, odds, evens->next);
}
}
通过使用静态(不是“堆栈”)时间,它的足迹可能不会增长:
static Node* temp;
temp = in;