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

需积分: 10 2 下载量 109 浏览量 更新于2024-07-28 收藏 696KB DOC 举报
"C++笔试题汇总,包含链表反转的两种方法以及String类的定义" 在C++的笔试题目中,链表反转是一个常见的问题,这里提供了两种不同的解决方案。第一种方法是迭代法,通过两个辅助指针pre和cur,逐个翻转链表中的节点。首先初始化pre为头节点,cur为头节点的下一个节点,然后在循环中,每次将cur所指节点的next指针指向前一个节点pre,再更新pre和cur到下一个位置,直到cur为空,表示链表反转完成。最后,为了保持头节点正确,需要将head指针更新为pre。 第二种方法是递归法,其思路是从尾部开始反向构建链表。递归函数接收当前节点p和头节点head的引用,如果p为空或其next为空,说明已经到达链表尾部,此时head就是新的头节点,返回p。否则,递归处理p的下一个节点,然后将返回的节点(原p的后继节点)的next指针指向前一个节点p,完成一次反转。需要注意的是,递归返回后需要将返回节点的next设为NULL,以断开反转形成的环。 此外,题目中还给出了一个String类的定义,它包括了通用构造函数、拷贝构造函数、析构函数和赋值运算符。为了实现这个类,我们需要考虑以下几个方面: 1. **通用构造函数**:创建一个String对象时,可以接受一个const char*类型的参数,表示字符串的原始数据。如果没有提供参数,默认构造一个空字符串。 ```cpp String::String(const char* str) { if (str != NULL) { m_data = new char[strlen(str) + 1]; strcpy(m_data, str); } else { m_data = new char[1]; // 为了容纳'\0' m_data[0] = '\0'; } } ``` 2. **拷贝构造函数**:当一个String对象被另一个已经存在的String对象复制时调用。需要深拷贝m_data,确保每个对象都有自己的字符串副本。 ```cpp String::String(const String& another) { m_data = new char[strlen(another.m_data) + 1]; strcpy(m_data, another.m_data); } ``` 3. **析构函数**:在对象生命周期结束时释放m_data所占的内存。 ```cpp String::~String() { delete[] m_data; } ``` 4. **赋值运算符**:实现浅复制到深复制的“规则”,即当一个String对象被赋值给另一个对象时,需要确保m_data指向的数据也被正确地复制。 ```cpp 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++程序员必备的基础技能。通过这些题目,可以加深对C++内存管理和数据结构的理解。