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

需积分: 12 5 下载量 6 浏览量 更新于2024-07-30 1 收藏 210KB PDF 举报
“c++笔试题汇总.pdf”是一个包含C++编程题目和常见笔试题目的PDF文档,主要聚焦于C++语言。文档中列举了多个经典问题,如链表反转等,适合于准备C++相关面试或提升编程技能的读者。 在C++中,链表反转是一个常见的数据结构操作。文档提供了两种链表反转的方法: 1. 非递归方法: 这种方法通过迭代完成,使用三个指针`pre`、`cur`和`ne`来分别跟踪当前节点、当前节点的下一个节点和当前节点的下一个节点的下一个节点。在遍历过程中,不断更新节点的`next`指针,使其指向前一个节点,直到遍历结束。最后,更新头节点`head`的指针并确保最后一个节点的`next`指针为`NULL`。以下是相应的代码实现: ```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; } ``` 2. 递归方法: 递归方法的核心思想是先反转链表的剩余部分,然后将当前节点连接到反转后的链表头部。这种方法需要注意在递归返回后断开循环。代码如下: ```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; } } ``` 此外,文档中还提到了`String`类的定义,这是一个简单的字符串类,包含了常见的构造函数、拷贝构造函数、析构函数和赋值运算符重载。为了实现这些成员函数,我们需要考虑内存管理以及确保正确处理字符串的复制和销毁。例如,`String`类的成员函数实现可能如下: ```cpp class String { public: String(const char* str = NULL) { if (str != NULL) { m_data = new char[strlen(str) + 1]; strcpy(m_data, str); } else { m_data = new char[1]; m_data[0] = '\0'; } } String(const String& another) { m_data = new char[strlen(another.m_data) + 1]; strcpy(m_data, another.m_data); } ~String() { delete[] m_data; } 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; // 用于保存字符串 }; ``` 这个简单的`String`类实现了基本的字符串操作,但是没有提供诸如字符串长度获取、字符串比较等其他功能。在实际应用中,C++通常使用STL中的`std::string`类,它提供了更全面的功能和更好的性能。