用C ++

时间:2015-10-09 10:22:45

标签: c++ pointers

最近我正在学习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;指向此列表的开头。

但是当我在调用这个函数后尝试打印这两个指针的值时,我发现它仍然指向同一个对象。

我已经检查了这两页,

Swapping two pointers

C++ Swapping Pointers

但我想要的是改变这两个指针的方向而不是指针所指向的对象的值。

我知道如果我修改此功能如下:

void swap_head_last(){
    static Node* n = head;
    head = last;
    last = n;
}

结果是正确的。

这个功能的问题是什么?

2 个答案:

答案 0 :(得分:5)

根本问题是您无法轻松交换单链表中的节点。实际上问题是当从一个节点移开一个节点时,必须修改前一个节点的后继节点。

另外,你实现swap的尝试什么都不做,它只是交换了两个局​​部变量(一旦函数完成就会被遗忘)。

相反,您可以使用引用来交换:

void swap(Node*& n1, Node*& n2)
{
    Node* n = n1;
    n1 = n2;
    n2 = n;
}

但正如所指出的,这仍然会留下只交换headlast的问题。倒数第二个元素仍然是它的继承者是旧的终极元素,你也必须更新该指针。

答案 1 :(得分:1)

试试这个:

void swap(Node** n1,Node** n2){
    Node* n = *n1;
    *n1 = *n2;
    *n2 = n;
}

Explination: 如果你必须交换两个整数,你需要void swap(int *,int *)。

因此,如果需要交换指针,则需要void swap(int **,int **)。

起初不是很直观。