You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++类成员函数中利用this交换自身与同类型指针的地址

双向链表swap函数优化:交换对象地址的思路不可行,正确实现看这里

为什么你的代码编译报错?

this在C++中是不可修改的指针常量(右值指针),它指向当前对象,但你不能给this赋值——就像不能写5 = 3一样,右值无法作为赋值操作的左操作数,所以this = temp会触发编译错误。

直接交换对象地址的思路根本行不通

就算编译器允许给this赋值,这种操作也完全达不到交换两个链表的目的:

  • 函数里的rhs是指针参数,你修改的只是函数内部的指针副本,外部调用者手里的对象地址不会有任何变化。
  • 对象的内存地址在创建后就固定了,无法通过赋值改变已存在对象的地址。

正确的优化方案:交换链表的内部核心成员

既然复制节点数据效率低,我们不需要动节点本身,只需要交换两个链表对象的内部管理指针和状态(比如头指针、尾指针、链表长度),这些成员数量极少,交换操作是O(1)时间复杂度,完全解决性能问题。

假设你的dLinkedList类定义包含以下核心成员:

class dLinkedList {
private:
    struct Node {
        int data;
        Node* prev;
        Node* next;
    };
    Node* head;   // 头节点指针
    Node* tail;   // 尾节点指针
    size_t size;  // 链表长度
public:
    void swap(dLinkedList& rhs);
    // 其他成员函数...
};

对应的swap函数实现:

#include <algorithm>  // 用于std::swap

void dLinkedList::swap(dLinkedList& rhs)
{
    // 直接交换三个核心成员,std::swap会自动处理临时变量
    std::swap(head, rhs.head);
    std::swap(tail, rhs.tail);
    std::swap(size, rhs.size);
}

如果不想依赖<algorithm>,也可以手动实现交换:

void dLinkedList::swap(dLinkedList& rhs)
{
    Node* temp_head = head;
    Node* temp_tail = tail;
    size_t temp_size = size;

    head = rhs.head;
    tail = rhs.tail;
    size = rhs.size;

    rhs.head = temp_head;
    rhs.tail = temp_tail;
    rhs.size = temp_size;
}

额外说明

把函数参数改成引用类型(dLinkedList& rhs)而非指针,是更符合C++风格的写法:

  • 避免空指针风险,调用时直接传对象即可(比如list1.swap(list2)),不需要取地址。
  • 保证操作的是原对象而非副本,真正完成两个链表的状态交换。

内容的提问来源于stack exchange,提问作者SogaBan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:18:30