我已经实现了一个简单的链表,我想交换节点。
struct Node{
Node(int a):val(a){};
int val;
Node *next;
};
class L{
public:
void swapL( int a , int b){
Node **one = &head;
Node **two = &head;
while( one ){
if( (*one) -> val == a ){
break;
}
one = &((*one) -> next);
}
while( two ){
if( (*two )-> val == a ){
break;
}
two = &((*two ) -> next);
}
cout << "Val one " << (*one) << endl;
cout << "Val two " << (*two) << endl;
swap( *one , *two);
}
void addLink( int a ){
if( !head ){
head = tail = new Node(a);
return;
}
Node *tmp = new Node(a);
tail -> next = tmp;
tail = tmp;
}
Node *head = nullptr;
Node *tail = nullptr;
void print(){
Node *tmp = head;
while(tmp){
cout << tmp -> val << endl;
tmp = tmp -> next;
}
}
};
int main()
{
L l;
l.addLink(1);
l.addLink(2);
l.addLink(3);
l.addLink(4);
l.addLink(5);
l.swapL(1 , 5);
l.print();
return 0;
}
我的问题是关于交换。在swapL()
中,我声明了一个指针指向指向类型Node
的指针。
我迭代直到条件设置。最终one
将指向一个指针,该指针指向val
等于a
的指针,two
指向b
的值。
在函数的最后一行,我使用
swap(*one , *two);
其中表示将one
指向的内存中的地址值移动到two
指向的内存中的地址,反之亦然。所以在此之后,two
指向指向节点的指针,其值为b
。但为什么链表中的节点也被交换了?我们只改变指向指针的指针,而不是指向指针本身的值。
我理解如果我只使用*one
和*two
,只是指针没有指向指针的指针。
这里发生了什么?