使用C++,设计一个算法,将一个带头结点的数据域依次为 a1、a2、…、an(n≥3)的单链表的 所有结点逆置,即第1个结点的数据域变为an,第2个结点的数据域变为an-1…,尾结点 的数据域变为 a1。
时间: 2024-10-12 15:14:59 浏览: 29
C++版本将两个有序链表合并为一个新的有序链表并返回原理及代码实现
在C++中,我们可以使用迭代的方式来实现单链表的逆置。以下是一个简单的算法:
首先,我们需要定义链表节点结构体 `Node`:
```cpp
struct Node {
int data;
Node* next;
};
```
然后创建两个指针,一个指向当前节点 (`current`),另一个指向前一个节点 (`prev`),初始时 `prev` 指向 `nullptr`,`current` 指向头节点 (`head`):
```cpp
Node* prev = nullptr;
Node* current = head;
```
接下来,我们遍历整个链表:
- 如果 `current` 不是 `nullptr`,说明还有节点需要处理:
- 交换 `prev` 和 `current` 的数据域:
```cpp
if (prev != nullptr) {
std::swap(prev->data, current->data);
}
```
- 将 `prev` 移动到下一个节点,`current` 移动到 `current->next`:
```cpp
prev = current;
current = current->next;
```
- 当 `current` 为 `nullptr` 时,循环结束。
最后,更新头节点为原链表的最后一个节点,即新的第一个节点:
```cpp
if (prev != nullptr) {
head = prev;
}
```
以下是完整的逆置链表函数:
```cpp
void reverseList(Node* &head) {
// ... 具体实现如上
}
```
阅读全文