C++面试必备:链表反转与String类实现解析

需积分: 9 16 下载量 46 浏览量 更新于2024-08-02 2 收藏 1.52MB PDF 举报
"C++ 笔试面试题及解析" 在C++编程语言中,链表是一种常见的数据结构,尤其在面试和笔试中,链表反转是一个经典的题目。这里我们讨论两种链表反转的方法。 首先,我们可以使用迭代的方式来反转链表。这种思路是使用三个指针pre、cur和ne,pre指向当前节点的前一个节点,cur指向当前节点,ne指向当前节点的下一个节点。在每次循环中,我们将cur节点的next指针指向前一个节点pre,然后更新pre和cur的值,直到遍历完整个链表。最后,需要将head指针指向新的链表头,即pre。以下是对应的C++代码实现: ```cpp struct Linka { int data; Linka* next; }; void reverse(Linka*& head) { if (head == NULL) return; Linka* pre = head; Linka* cur = head->next; while (cur) { Linka* ne = cur->next; cur->next = pre; pre = cur; cur = ne; } head->next = NULL; head = pre; } ``` 第二种方法是使用递归。这种做法是从尾到头逐步反转链表,每次递归处理链表的后半部分,然后再将当前节点指向其前一个节点。递归终止条件是链表为空或只有一个节点。在反转过程中,由于递归返回的节点会形成一个环,所以需要在返回时将其next指针设为NULL。以下为递归实现的代码: ```cpp Linka* reverse(Linka* p, Linka*& head) { if (p == NULL || p->next == NULL) { head = p; return p; } else { Linka* tmp = reverse(p->next, head); tmp->next = p; return p; } } ``` 此外,面试中还经常会涉及到C++的类设计,如给出的`String`类。这个类是一个基本的字符串类,包含以下几个核心成员: 1. **构造函数**: - `String(const char* str=NULL)`: 通用构造函数,用于创建一个空字符串或根据传入的C风格字符串初始化字符串对象。 - `String(const String& another)`: 拷贝构造函数,用于创建一个新对象,复制另一个`String`对象的内容。 2. **析构函数**: - `~String()`: 析构函数,负责释放`m_data`指向的内存。 3. **赋值运算符**: - `String& operator=(const String& rhs)`: 赋值函数(又称拷贝赋值运算符),用于将一个`String`对象的值赋给另一个对象。需要注意的是,为了防止浅拷贝导致的问题,这个函数通常需要执行深拷贝。 4. **私有成员变量**: - `char* m_data`: 用于保存字符串的动态数组,通常需要在类内部进行内存管理,包括分配和释放。 在实现这些成员函数时,要特别注意内存管理和异常安全,例如在拷贝构造函数和赋值运算符中避免出现悬挂指针或内存泄漏。同时,为了保持类的封装性,`m_data`应声明为私有的,只允许通过类的成员函数访问。