C++笔试题精华:链表反转与String类操作

需积分: 12 7 下载量 96 浏览量 更新于2024-07-29 收藏 210KB PDF 举报
在C++的面试题库中,链表反转是一个常见的基础问题,考察的是程序员对数据结构的理解和操作能力。以下是两种常用的链表反转方法: 1. **迭代法**: 单向链表的反转通常通过迭代实现。首先定义一个结构体`linka`,包含整型数据`data`和指向下一个节点的指针`next`。关键代码如下: - 定义一个辅助指针`pre`,初始时指向头节点,`cur`指向下个节点,`ne`暂存下一个节点的指针。 - 在循环中,依次将`cur`的`next`指向前一个节点`pre`,然后更新`pre`和`cur`为下一个节点,直到`cur`变为`NULL`。 - 最后,将头节点的`next`设为`NULL`,并更新头节点为反转后的第一个节点。 2. **递归法**: 这种方法通过递归地处理链表的剩余部分,直到遇到空节点或只有一个节点的链表。在递归过程中,需要确保每次返回时将当前节点的`next`指向前一个递归调用的结果,但为了防止形成环,需要在递归结束时将返回的节点的`next`域置为`NULL`。递归函数`reverse`接受一个指针`p`和头节点指针`head`作为参数。 接下来是关于`String`类的部分。这是一个简单的C++类定义,包含基本的构造函数、拷贝构造函数、析构函数和赋值函数。以下是可能的实现: ```cpp class String { public: // 通用构造函数,如果参数为空,则创建空字符串 String(const char* str = NULL) : m_data(new char[strlen(str) + 1]) { if (str) { strcpy(m_data, str); } else { m_data[0] = '\0'; } } // 拷贝构造函数,复制另一个String对象的内容 String(const String& another) : m_data(new char[strlen(another.m_data) + 1]) { strcpy(m_data, another.m_data); } // 析构函数,释放内存 ~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; } private: char* m_data; // 用于保存字符串的字符数组 }; ``` 在这个类中,`m_data`私有变量用于存储字符串,`operator=`函数负责安全地进行赋值操作,避免内存泄漏。注意,这里的赋值操作使用了深拷贝(deep copy),即完全复制对象的内存内容,而不是引用。