交换指针与交换指针指针

时间:2016-11-08 23:19:16

标签: c++ pointers linked-list

我已经实现了一个简单的链表,我想交换节点。

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,只是指针没有指向指针的指针。

这里发生了什么?

0 个答案:

没有答案