最近我正在学习C ++中的Link-List。 这是我的代码:
#include <iostream>
using namespace std;
class Node{
Node* next;
int num;
public:
Node(int num){
this->num = num;
}
void connect(Node* next){
this->next = next;
}
Node* next_node(){
return next;
}
void COUT(){
cout<<this->num<<endl;
}
};
void swap(Node* n1,Node* n2){
static Node* n = n1;
n1 = n2;
n2 = n;
}
class List{
Node* head;
Node* last;
public:
List(){
head = 0;
last = 0;
}
void insert(Node* n){
if(head==0){
head = n;
last = n;
}
else{
last->connect(n);
last = n;
}
}
void swap_head_last(){
swap(head,last);
}
};
int main()
{
List* LL = new List();
for(int i=0;i<10;i++){
LL->insert(new Node(i));
}
LL->swap_head_last();
return 0;
}
在我尝试制作&#34; void swap_head_last()&#34;之前没有错误。 我想在这个函数中做的是做指针&#34; * head&#34;指向此列表的末尾,并且还指向&#34; * last&#34;指向此列表的开头。
但是当我在调用这个函数后尝试打印这两个指针的值时,我发现它仍然指向同一个对象。
我已经检查了这两页,
但我想要的是改变这两个指针的方向而不是指针所指向的对象的值。
我知道如果我修改此功能如下:
void swap_head_last(){
static Node* n = head;
head = last;
last = n;
}
结果是正确的。
这个功能的问题是什么?
答案 0 :(得分:5)
根本问题是您无法轻松交换单链表中的节点。实际上问题是当从一个节点移开一个节点时,必须修改前一个节点的后继节点。
另外,你实现swap的尝试什么都不做,它只是交换了两个局部变量(一旦函数完成就会被遗忘)。
相反,您可以使用引用来交换:
void swap(Node*& n1, Node*& n2)
{
Node* n = n1;
n1 = n2;
n2 = n;
}
但正如所指出的,这仍然会留下只交换head
和last
的问题。倒数第二个元素仍然是它的继承者是旧的终极元素,你也必须更新该指针。
答案 1 :(得分:1)
试试这个:
void swap(Node** n1,Node** n2){
Node* n = *n1;
*n1 = *n2;
*n2 = n;
}
Explination: 如果你必须交换两个整数,你需要void swap(int *,int *)。
因此,如果需要交换指针,则需要void swap(int **,int **)。
起初不是很直观。