我试图反转链接列表并将其保存到另一个新的喜欢列表中并删除旧列表,但编译时出错...这里有函数..
LinkedList LinkedList::reverse(){
LinkedList L2;
Node * temp=head;
while(temp->next!=NULL){
Node * del=NULL;
L2.addAtFront(temp->data);
del=temp;
temp=temp->next;
delete del;
}
return L2;
}
答案 0 :(得分:1)
如果(且仅当)您不再需要原始链接列表,请使用此选项!
不是使用便宜的addAtFront
(因为你需要为新节点分配内存并销毁旧节点),而是重用节点和{{1} (毕竟,你打算删除原来的,只需设置指针:
LinkedList
该方法的工作原理如下,您扫描原始列表并使用三个引用:LinkedList LinkedList::reverse(){
Node* na = head;
Node* nb = NULL;
Node* nc = NULL;
if(na == NULL) {
return this;
}
nb = na->next;
na->next = NULL;
while(nb != NULL){
nc = nb->next;
nb->next = na;
na = nb;
nb = nc;
}
tail = head; //if you keep a tail?
head = na;
return this;
}
,na
和nb
。谁按原始列表的顺序组织。
现在您确定nc
和na
在nb
循环中有效。首先,请确保通过将其存储在while
中来保留对nb
的引用。接下来,您将nc
的{{1}}设置为->next
(最初nb
为na
),现在它已被撤消。
然后你转移过程:na->next
变为旧的nb
,na
旧nb
。你不断重复这个,直到你到达链表的末尾。
您需要完成两项额外任务:
- 将原始nb
' s nc
设置为head
,否则您将构建一个周期;和
- 将原始->next
的尾部设置为null
。
如果你保持LinkedList
,首先需要将其设置为头部。