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

需积分: 12 0 下载量 170 浏览量 更新于2024-07-22 收藏 210KB PDF 举报
"C++ 笔试资源集合,包括链表反转问题及String类的实现" 在C++的笔试题目中,链表反转是一个常见的问题,主要考察对数据结构和指针操作的理解。这里提供了两种解决单向链表反转的方法。 方法一:迭代法 迭代法是最直观的方式,通过两个辅助指针pre和cur,逐步反转链表中的指向关系。首先,初始化pre为头节点,cur为头节点的下一个节点。在循环中,每次将cur指向的下一个节点(ne)暂存,然后将cur节点的next指针指向前一个节点pre,接着更新pre和cur为下一个需要处理的节点。当遍历到链表末尾时,需要将头节点的next指针设为NULL,并将头节点更新为pre,以完成反转。 ```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; } ``` 方法二:递归法 递归法则是通过递归函数反转链表的剩余部分,然后再处理当前节点。首先判断如果p为空或者其next为空,那么反转结束,返回当前节点作为新的头节点。否则,递归反转p的下一个节点,然后将当前节点挂在其反转后的next上,最后返回当前节点。需要注意的是,递归结束后,需要将返回节点的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; } } ``` 此外,题目中还提到了一个String类的定义,这是C++中对字符串对象的一种自定义封装。类的成员函数需要实现如下: 1. 通用构造函数:创建String对象时,可以接受一个可选的const char*参数,表示字符串的初始值。如果没有提供参数,字符串默认为空。 2. 拷贝构造函数:当创建一个新的String对象时,若传入的是已存在的String对象,则通过拷贝构造函数复制原有对象的内容,实现深拷贝。 3. 析构函数:当String对象生命周期结束时,析构函数用于释放m_data所指向的内存。 4. 赋值函数:实现String对象的赋值操作,即右值rhs赋给当前对象,应确保左值和右值对象的字符串内容正确交换或复制。 ```cpp class String { public: String(const char* str = NULL) { // 通用构造函数 if (str != NULL) m_data = new char[strlen(str) + 1]; else m_data = new char[1]; strcpy(m_data, str); } 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; // 用于保存字符串 }; ``` 以上就是关于C++笔试中链表反转问题的解决方案和String类成员函数的实现。理解和掌握这些知识点对于准备C++相关的笔试和面试至关重要。