【问题标题】:How to "delete" original linked list when splitting the linked list into odd and even?将链表拆分为奇数和偶数时如何“删除”原始链表?
【发布时间】:2021-05-10 10:26:04
【问题描述】:

这是我使用的原始代码:

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;
}

【问题讨论】:

  • 在调用函数后不能简单地添加in= NULL;吗?
  • 你的意思是 in = NULL; 在 main 函数调用之后?如果这是你的意思,那是不允许的。我只需要提交拆分功能。 main 函数只是我为测试而创建的。
  • 由于其他列表已经工作,一个简单的解决方法是编写一个小的包装函数来完成它。
  • 那会是什么样子?我试图找出类似的东西,但我不完全确定如何去做。因为这是一个头递归函数。
  • 嗯……是尾递归函数?此外,通过将节点从原始列表移动到结果列表可能会更优雅,不需要额外的删除工作。从头指针开始并将其归零,因此调用者会发现它为空。

标签: c++ recursion linked-list singly-linked-list


【解决方案1】:

您可以通过擦除原始列表中的指针移动节点到一个或另一个列表: 不是一个完美但有效的解决方案(如果你想在编译器中运行它以查看它是如何工作的,则添加打印以说明它是如何工作的)

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多