C++大学教程第九版第十八章习题18.4
时间: 2023-11-02 16:06:56 浏览: 49
题目描述:
给定一个单链表,每个节点包含一个整数值。请编写一个函数来判断该链表是否为回文。回文意味着从前往后读和从后往前读都是一样的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
解题思路:
本题可以采用快慢指针找到链表的中点,然后将中点后面的链表反转,最后比较前半部分和反转后的后半部分是否相同即可。
具体步骤如下:
1. 用快慢指针找到链表的中点,当快指针到达链表末尾时,慢指针恰好到达链表中点。
2. 将中点后面的链表反转,这一步可以采用迭代或递归实现。
3. 比较前半部分和反转后的后半部分是否相同。
代码实现:
相关问题
C++大学教程第九版18.4题
题目描述:
定义一个基类 `Shape`,其中包含一个纯虚函数 `getArea()`。从 `Shape` 派生出两个类 `Rectangle` 和 `Circle`,分别实现 `getArea()` 函数以计算矩形和圆的面积。在主函数中创建这两个类的对象并调用它们的 `getArea()` 函数。
解题思路:
1. 定义基类 `Shape`,包含纯虚函数 `getArea()`。
2. 从 `Shape` 派生出两个派生类 `Rectangle` 和 `Circle`。
3. 在 `Rectangle` 类中实现 `getArea()` 函数以计算矩形的面积。
4. 在 `Circle` 类中实现 `getArea()` 函数以计算圆的面积。
5. 在主函数中创建 `Rectangle` 和 `Circle` 对象,并分别调用它们的 `getArea()` 函数。
参考代码:
```c++
#include <iostream>
using namespace std;
class Shape {
public:
virtual double getArea() = 0; // 纯虚函数
};
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) {
width = w;
height = h;
}
double getArea() override {
return width * height;
}
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) {
radius = r;
}
double getArea() override {
return 3.1415926 * radius * radius;
}
};
int main() {
Rectangle r(4, 5);
Circle c(3);
cout << "Rectangle area is: " << r.getArea() << endl;
cout << "Circle area is: " << c.getArea() << endl;
return 0;
}
```
输出结果:
```
Rectangle area is: 20
Circle area is: 28.2743
```
C++大学教程第九版18.4Array类模板
该书第九版中的Array类模板是一个非常简单的模板,用于创建动态数组。以下是该模板的代码:
```cpp
template<class T>
class Array
{
private:
T *ptr;
int size;
public:
Array(T arr[], int s);
void print();
};
template<class T>
Array<T>::Array(T arr[], int s)
{
ptr = new T[s];
size = s;
for(int i = 0; i < size; i++)
ptr[i] = arr[i];
}
template<class T>
void Array<T>::print()
{
for(int i = 0; i < size; i++)
cout<<" "<<*(ptr + i);
cout<<endl;
}
```
该模板提供了两个公共方法:构造函数和print()方法。构造函数用于初始化数组,而print()方法用于打印数组中的元素。
使用该模板非常简单,只需要指定数组类型并传递一个数组和其大小即可:
```cpp
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
Array<int> a(arr, 5);
a.print();
return 0;
}
```
输出结果为:
```
1 2 3 4 5
```
需要注意的是,该模板没有提供数组越界检查,因此使用时需要确保不会出现越界访问的情况。