C++面试经典题解:链表反转与String类实现

需积分: 12 1 下载量 16 浏览量 更新于2024-07-25 收藏 210KB PDF 举报
在C++面试中,链表反转是一个经典的题目,考察基础数据结构操作和递归理解。以下是两种常见的链表反转方法: 1. **迭代法**: 单向链表反转的核心思想是使用两个指针,一个前驱(pre)指针和一个当前(cur)指针。初始化时,前驱指向头节点,当前指向头节点的下一个。然后,遍历链表,每次循环中: - 保存当前节点的下一个节点(ne) - 将当前节点的next指向前驱 - 更新前驱和当前指针,分别指向当前节点和原来下一个节点 - 当遍历结束时,链表尾部的指针会指向头节点,将头节点的next设为NULL,最后将前驱指针更新为新的头节点。 ```cpp void reverse(linka*& head) { // ... (代码省略) } ``` 2. **递归法**: 递归法反转链表则采用分治策略,首先检查是否到达链表尾部(即p或p->next为NULL),如果是,则返回当前节点;否则,递归处理后续节点,并将结果的next指针指向当前节点。注意,在递归结束后需要处理最后一个节点的next域,防止形成环。 ```cpp linka* reverse(linka* p, linka*& head) { // ... (代码省略) } ``` 接着,我们看到一个`String`类的定义,包括构造函数、拷贝构造函数、析构函数以及赋值函数。这些函数是C++类的基础组成部分,用于对象的创建、复制和内存管理。 - **构造函数**:通用构造函数`String(const char* str = NULL)`接受一个可选的字符串指针,用于初始化空字符串或指定字符串。 - **拷贝构造函数**:`String(const String& another)`用于创建一个新的String对象,内容与给定的对象`another`相同。 - **析构函数**:`~String()`在对象生命周期结束时自动调用,负责释放内存,特别是`m_data`所占用的内存。 - **赋值函数**:`String& operator=(const String& rhs)`用于将右侧对象的内容复制到左侧对象,这里需要确保左操作数和右操作数不是同一对象,避免浅拷贝。 由于没有给出成员函数的具体实现,以下是一个简单的实现示例: ```cpp String::String(const char* str) : m_data(new char[strlen(str) + 1]) { strcpy(m_data, str); } String::String(const String& another) : m_data(new char[strlen(another.m_data) + 1]) { strcpy(m_data, another.m_data); } String::~String() { delete[] m_data; } String& String::operator=(const String& rhs) { if (this != &rhs) { // 防止浅拷贝 delete[] m_data; m_data = new char[strlen(rhs.m_data) + 1]; strcpy(m_data, rhs.m_data); } return *this; } ``` 这些知识点展示了C++面试中关于链表操作和类设计的常见问题,对于理解链表数据结构的灵活运用和面向对象编程的基础概念至关重要。