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解决方案都是受欢迎的。另请指出上述代码中的错误。
这是我自己的练习题,但不是作业问题
答案 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