【问题标题】:Copy the reverse of a linked list复制链表的反面
【发布时间】:2012-07-28 16:55:44
【问题描述】:

copyRev

void copyRev(node *head1, node *&head2)
{

    stack<int> dat;
    node* curr = head1;
    while(curr!=NULL){
        dat.push(curr->data);
        curr = curr->next;
    }
    while(!dat.empty()){
        append(head2,dat.top());
        dat.pop();
    }

}

追加

void append(node* &head, int data){

    if(head==NULL){
        head= new node;
        head->data = data;
        head->next = NULL;
    }
    else{

        node *curr = head;
        while((curr)->next!=NULL){
            (curr) = (curr)->next;
        }
        (curr)->next = new node;
        (curr) = (curr)->next;
        (curr)->data = data;
        (curr)->next = NULL;
    }
}

好吧,我正在尝试克隆链表的反向。我知道如何将列表反转到位。但是这段代码给了我一个Bus error(code dumped)

这就是我在main()中调用函数的方式

node *head;

    for(int i = 0;i<9;i++){
        append(head,i*i);
    }
    node *revHead;
    printList(head);

    copyRev(head,revHead);
    printList(revHead);

append() 函数中,我检查NULL 头,如果它为NULL,则创建一个新节点。此外, append 函数正确地将元素添加到列表中。这个问题是在我调用了copyRev 过程之后才出现的。

我已经尝试过就地反转并且它有效。我需要克隆链表的反向。欢迎使用迭代和递归解决方案。另外请指出上述代码中的错误。

这是我自己的练习题,不是作业题

【问题讨论】:

  • 尝试向我们展示append 函数。
  • 学习使用 Stack 交换网站使用的标记。
  • 谢谢。会学到的。
  • 您是否想过将列表节点包装到符合 STL 的迭代器(例如使用 boost::iterator),然后让 STL 算法完成这项工作?
  • @PaulMichalik:你能提供一些链接吗?我正在学习所有这些。

标签: c++ linked-list


【解决方案1】:

你没有初始化你的指针:

node *head;
node *revHead;

因此它们具有不确定的值(即它们是随机的)。

以任何方式使用这些指针中的值都是未定义的行为。这可能是您的错误。

只需初始化它们:

node*  head     = NULL;
node*  revHead  = NULL;

原地链表的递归反向:

void reverse(node*& head)
{
     head = reverse(head, NULL);
}
node* reverse(node* item, node* next)
{
     if (item == NULL)
     {    return next;
     }
     node*  iter = item->next;
     item->next  = next;
     return reverse(iter, item);
}

【讨论】:

  • @SrinathGS:是的。但还有其他事情我会先解决。你的风格还是很C的。 C++ 鼓励更好的封装。一旦你这样做了,那么递归解决方案也会变得更容易。
  • 好的。看看我怎么能做到这一点。有关该主题的任何链接?
【解决方案2】:

乍一看你忘了初始化列表头:

node *head = 0;

编辑感谢 Alan: 和 revHead

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2016-09-26
    • 2014-05-01
    相关资源
    最近更新 更多