单链表的逆置c++的算法
时间: 2024-09-27 07:07:35 浏览: 40
单链表逆置的C++算法通常使用迭代或递归的方式实现。这里是一个常见的迭代方法:
```cpp
void reverseList(ListNode* &head) {
ListNode *prev = nullptr, *current = head, *next = nullptr;
while (current != nullptr) {
// 保存当前节点的下一个节点
next = current->next;
// 将当前节点指向前一个节点
current->next = prev;
// 移动指针向前
prev = current;
current = next;
}
// 更新头节点为新的首节点
head = prev;
}
```
在这个算法中,我们维护三个指针:`prev`、`current` 和 `next`。初始时,`prev` 指向 `nullptr`,`current` 指向链表的头节点,`next` 则指向 `current` 的下一个节点。每次循环中,我们将 `current` 的 `next` 指向 `prev`,然后移动指针到下一对节点,直到遍历完整个链表。最后,链表的头节点就被设置为了原链表的尾节点。
相关问题
用C++单链表就地逆置算法
在C++中,单链表的就地逆置(也称为原地逆置或反转)是指在不使用额外空间的情况下,改变链表节点的指向,使得原来的头结点变成新的尾节点,而原来的尾节点变成新的头节点。以下是常见的递归和迭代两种方式的算法:
**1. 递归法**
```cpp
void reverseList(Node* &head) {
if (head == nullptr || head->next == nullptr) { // base case: 空链表或只有一个元素的链表
return;
}
Node *prev = nullptr; // 上一个节点
Node *curr = head; // 当前节点
reverseList(curr->next); // 递归处理剩余部分
prev = curr; // 更新prev为当前节点
curr->next = prev; // 交换 curr 和 prev 的指针
head = curr; // 新的头节点是当前节点
}
```
**2. 迭代法**
```cpp
void reverseList(Node* &head) {
Node *prev = nullptr, *curr = head, *next = nullptr;
while (curr != nullptr) {
next = curr->next; // 记录当前节点的下一个节点
curr->next = prev; // 将当前节点的next指向前一个节点
prev = curr; // 移动prev到curr
curr = next; // 移动curr到下一个节点
}
head = prev; // 最终的新头节点是原始的尾节点
}
```
实验题目: 1 顺序表逆置算法 2 单链表的逆置算法 实验代码 实验结果
对于这两个实验题目,实验代码的具体编写会因使用的编程语言而异,以下是简要的示例说明:
1. **顺序表逆置算法(Python)**:
```python
def reverse_array(arr):
start, end = 0, len(arr) - 1
while start < end:
arr[start], arr[end] = arr[end], arr[start]
start += 1
end -= 1
return arr
# 示例
original_array = [1, 2, 3, 4, 5]
reversed_array = reverse_array(original_array)
```
2. **单链表逆置算法(C++)**:
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr, *current = head;
while (current != nullptr) {
ListNode* next_temp = current->next;
current->next = prev;
prev = current;
current = next_temp;
}
return prev;
}
```
实验结果通常会在运行上述代码并打印原始和处理后的数据结构后得出:
- 对于顺序表,你会看到数组元素是否按照预期进行了逆序。
- 对于单链表,观察前驱和后继指针的变化以及链表节点的新序列。
要得到详细的实验结果,你需要亲自运行代码并在控制台上查看输出,或者用特定的测试用例验证链表节点的顺序。
阅读全文