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

需积分: 9 13 下载量 57 浏览量 更新于2024-08-02 收藏 84KB DOC 举报
"这篇资料主要包含了两个C++的经典笔试题目,分别是链表反转和自定义String类的实现。" 对于链表反转这个题目,我们有两种常见的解决方案。第一种是非递归方式,通过迭代实现。首先,我们需要三个指针,`pre`、`cur`和`ne`,分别代表当前节点的前一个节点、当前节点和当前节点的下一个节点。初始化时,`pre`为`head`,`cur`为`head->next`。在循环中,我们将`cur`的`next`指针指向前一个节点`pre`,然后更新`pre`和`cur`为它们的下一个节点,直到`cur`为空,最后将`head`指向反转后的链表的尾部,即`pre`。 第二种方法是递归方式。这个方法的思路是从后往前反转链表,通过递归调用反转后面的子链表,然后将当前节点指向其前一个节点。然而,递归方法在反转完链表后,最后一个节点的`next`指针会指向原头节点,形成环,因此需要在返回结果后将其置为`NULL`。由于需要改变`head`指针,这里使用了引用传递。 接下来是关于自定义`String`类的实现。这个类有四个基本的成员函数,它们是构造函数、拷贝构造函数、析构函数和赋值运算符重载。 1. 构造函数:接受一个`const char*`参数,用于初始化字符串。如果没有参数或参数为`NULL`,则创建一个空字符串。 ```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]; m_data[0] = '\0'; } } ``` 2. 拷贝构造函数:用于创建一个与已有`String`对象相同的新对象。它需要复制原始对象的字符串数据。 ```cpp String::String(const String& another) { m_data = new char[strlen(another.m_data) + 1]; strcpy(m_data, another.m_data); } ``` 3. 析构函数:负责释放分配的内存。 ```cpp String::~String() { delete[] m_data; m_data = NULL; } ``` 4. 赋值运算符重载:实现浅拷贝,将一个`String`对象的值赋给另一个。 ```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; } ``` 这些基本的成员函数确保了`String`类能够正确地创建、复制和销毁,并且能够进行赋值操作。在实际编程中,还需要考虑其他功能,如字符串的比较、拼接等,但上述代码是实现基本功能的基础。