C++笔试常见题型:链表反转与String类实现

需积分: 12 1 下载量 183 浏览量 更新于2024-07-25 收藏 210KB PDF 举报
"C++笔试题汇总,包括链表反转和String类实现的题目" 在C++编程中,面试和笔试中经常会遇到一些基础但重要的问题,例如链表的反转和自定义字符串类的实现。这里我们将详细探讨这两个知识点。 首先,我们来看链表反转的问题。链表反转是一个经典的数据结构问题,它可以有效地测试程序员对指针操作的理解。常见的方法有两种:一种是迭代法,另一种是递归法。 1. 迭代法: 这种方法通过两个辅助指针pre和cur来实现。初始时,pre指向头节点,cur指向头节点的下一个节点。在循环中,每次将cur指向的节点的next指针指向前一个节点pre,然后pre和cur都向前移动一位,直到cur为空,此时pre即为新的头节点。最后,将头节点的next设为NULL,完成反转。对应的C++代码如下: ```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. 递归法: 递归法的思想是从尾部开始,每次反转一个节点及其后面的子链表。在递归过程中,将反转后的子链表的头部连接到当前节点,然后返回当前节点。需要注意的是,递归结束时,由于链表已经反转,最后一个节点的next应设为NULL。C++代码如下: ```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++中,创建一个类似于C++标准库中的`std::string`类可以帮助我们理解对象的生命周期管理,深拷贝和浅拷贝等问题。下面是一个简单的`String`类实现: ```cpp class String { public: // 通用构造函数 String(const char* str = NULL) : m_data(new char[strlen(str) + 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; // 用于保存字符串 }; ``` 这个`String`类实现了基本的构造、拷贝构造、析构和赋值操作,确保了对象间的正确复制和内存管理。特别地,赋值运算符采用自赋值安全的方式,避免了自我赋值时可能导致的问题。 以上就是关于C++笔试中常见的链表反转问题和自定义字符串类实现的详细解答,这些知识点对于理解和掌握C++编程至关重要。
2024-10-17 上传