5.请用C/C++语言设计算法,通过遍历一趟,将链表中所有结点的链接方向逆转 ,仍利用原表的存储空间。
时间: 2024-12-16 11:29:47 浏览: 4
为了反转一个单向链表,你可以创建一个新的指针,并通过迭代的方式,每次交换当前节点与其前驱节点的指针。以下是使用C++实现该算法的一个简单示例:
```cpp
#include <iostream>
struct Node {
int data;
Node* next;
};
// 创建新节点
Node* createNode(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = nullptr;
return newNode;
}
// 反转链表函数
void reverseList(Node** head) {
Node* prev = nullptr;
Node* current = *head;
Node* nextTemp = nullptr;
// 遍历链表
while (current != nullptr) {
// 保存当前节点的下一个节点
nextTemp = current->next;
// 将当前节点的next指向前一个节点
current->next = prev;
// 更新prev、current
prev = current;
current = nextTemp;
}
// 设置新的头节点为原头节点的前一个节点
*head = prev;
}
// 打印链表
void printList(Node* node) {
while (node != nullptr) {
std::cout << node->data << " ";
node = node->next;
}
std::cout << "\n";
}
int main() {
Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
std::cout << "Original list: ";
printList(head);
reverseList(&head);
std::cout << "Reversed list: ";
printList(head);
return 0;
}
```
这个程序首先定义了一个链表节点结构,接着创建了`reverseList`函数,它接受链表头节点的地址作为参数。在函数内部,通过三个指针`prev`、`current`和`nextTemp`,分别代表前一个节点、当前节点和临时储存当前节点的下一个节点。遍历过程中,每一步都改变了节点的指向,使得最后链表的方向发生反转。
阅读全文