复制链接列表的反向

时间:2012-07-28 08:34:38

标签: c++ linked-list

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程序后才会出现问题。

我尝试过就地倒车而且有效。我需要克隆链表的反向。 Iterative和Recursive解决方案都是受欢迎的。另请指出上述代码中的错误。

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

2 个答案:

答案 0 :(得分:1)

您没有初始化指针:

node *head;
node *revHead;

因此,他们有不确定的价值(即他们是随机的)。

以任何方式使用这些poitner中的值是未定义的行为。这可能是你的错误。

刚刚初始化它们:

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

答案 1 :(得分:0)

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

node *head = 0;

编辑感谢Alan:还有revHead