【问题标题】:Swap the pointer in C++在 C++ 中交换指针
【发布时间】:2015-10-09 10:22:44
【问题描述】:

最近我正在学习 C++ 中的链接列表。 这是我的代码:

#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;
}

在我尝试创建“void swap_head_last()”之前没有错误。 我想在这个函数中做的是让指针“*head”指向这个列表的末尾,同时让指针“*last”指向这个列表的开头。

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

我已经检查了这两页,

Swapping two pointers

C++ Swapping Pointers

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

我知道如果我修改这个函数如下:

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

结果是正确的。

这个函数有什么问题?

【问题讨论】:

  • static Node* n = n1;只初始化一次,去掉static关键字
  • C++中的链表是std::list&lt;int&gt; l
  • @LightnessRacesinOrbit 也许吧,但仅仅使用现成的课程就没有什么教育意义了。
  • @skyking:我不同意。
  • @LightnessRacesinOrbit 欢迎您不同意,但是您仅使用std::list&lt;int&gt; 对链表有什么了解?您当然可以检查来源,但您可能更有可能从教科书中获得任何有用的信息并自行尝试。

标签: c++ pointers


【解决方案1】:

根本问题是你不能轻易地交换单链表中的节点。实际上的问题是,当从它的位置移开一个节点时,必须修改前一个节点的后继节点。

此外,您实现交换的尝试没有任何作用,它只是交换两个局部变量(函数完成后将立即忘记)。

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

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

但正如所指出的,这仍然会留下只有headlast 将被交换的问题。倒数第二个元素的后继元素仍将是旧的最终元素,您还必须更新该指针。

【讨论】:

  • 本可以从&lt;algorithm&gt;使用std::swap
  • @thab 是的,但我认为这个人并没有从中学到很多东西。如果他使用现成的解决方案来解决问题,他就不会遇到这些问题,也不会真正学到任何东西。
【解决方案2】:

试试这个:

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

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

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

一开始不是很直观。

【讨论】:

  • 我们在 C++ 中这样做的一个很好的理由。这是古老的C魔法。使用 C++ 中的引用获得巨大成功。或者,好吧,std::swap