C/C++笔试题精选:链表反转与String类解析

需积分: 0 1 下载量 171 浏览量 更新于2024-07-24 收藏 1MB PDF 举报
“C笔试题汇总,包括C++相关题目,适合初学者和软件开发者的复习资料。” 这篇文档主要汇总了两个C++相关的笔试题目,一个是链表反转,另一个是关于String类的定义。以下是这两个知识点的详细解释: ### 链表反转 链表反转是一个常见的数据结构问题,通常在面试和笔试中出现。这里有两种常见的解决方案。 **方法一:迭代法** 迭代法通过使用三个指针`pre`、`cur`和`ne`来实现链表反转。首先,`pre`初始化为`head`,`cur`初始化为`head->next`,`ne`用于存储`cur`的下一个节点。在循环中,每次将`cur`的`next`指针指向前一个节点`pre`,然后更新`pre`和`cur`为它们的下一个节点,直到`cur`为空。最后,将`head`指针指向反转后的链表头`pre`,并确保`head->next`为`NULL`以完成反转。 ```cpp struct Node { int data; Node* next; }; void reverse(Node*& head) { if (head == NULL) return; Node* pre = head; Node* cur = head->next; while (cur) { Node* ne = cur->next; cur->next = pre; pre = cur; cur = ne; } head->next = NULL; head = pre; } ``` **方法二:递归法** 递归法的思想是先反转链表的剩余部分,然后再处理当前节点。递归函数接收当前节点`p`和头节点`head`的引用。当`p`或`p->next`为空时,递归结束,返回`p`作为新的头节点。否则,递归反转`p->next`,然后将`p`插入到反转后的链表头部。注意,返回的节点`next`指针需要设置为`NULL`以避免形成环。 ```cpp Node* reverse(Node* p, Node*& head) { if (p == NULL || p->next == NULL) { head = p; return p; } else { Node* tmp = reverse(p->next, head); tmp->next = p; return p; } } ``` ### String类定义 在C++中,`String`类通常用于封装字符串操作。以下是一个简单的`String`类定义,包含几个关键的成员函数: 1. **构造函数**:默认构造函数接受一个可选的`const char*`参数,用于初始化字符串。如果未提供参数,字符串默认为空。 ```cpp String(const char* str = NULL); ``` 2. **拷贝构造函数**:当一个`String`对象被用作另一个`String`对象的初始值时,拷贝构造函数用于复制所有数据。 ```cpp String(const String& another); ``` 3. **析构函数**:`String`对象销毁时,析构函数负责清理分配的内存。 ```cpp ~String(); ``` 4. **赋值运算符重载**:这个函数允许一个`String`对象赋值给另一个`String`对象,执行深拷贝。它遵循右结合性,即`a = b = c`等价于`a = (b = c)`。 ```cpp String& operator=(const String& rhs); ``` 这个简化的`String`类定义提供了基本的字符串操作,但在实际应用中,通常会扩展更多的功能,如字符串拼接、查找、替换等。对于初学者来说,理解这些基础成员函数的作用和实现方式是学习C++编程的关键步骤。