鱼C论坛

 找回密码
 立即注册
查看: 1820|回复: 1

[已解决]将链表反转的问题

[复制链接]
发表于 2023-4-2 21:16:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.设计一个函数,传入链表的头指针,实现将链表反转。
示例:
链表节点定义:
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
函数接口定义:
ListNode* reverseList(ListNode* head) {
//完成该函数
}
最佳答案
2023-4-2 21:19:19
在这个问题中,我们需要实现一个函数 reverseList,它接收一个链表的头指针,然后将链表反转。我们可以通过迭代或递归的方式来实现这个功能。这里,我将展示一种迭代的实现方法:

  1. #include <iostream>

  2. struct ListNode {
  3.     int val;
  4.     ListNode *next;
  5.     ListNode() : val(0), next(nullptr) {}
  6.     ListNode(int x) : val(x), next(nullptr) {}
  7.     ListNode(int x, ListNode *next) : val(x), next(next) {}
  8. };

  9. ListNode* reverseList(ListNode* head) {
  10.     ListNode* prev = nullptr; // 初始化前一个节点指针
  11.     ListNode* current = head; // 初始化当前节点指针
  12.     ListNode* nextNode = nullptr; // 初始化下一个节点指针

  13.     while (current != nullptr) {
  14.         nextNode = current->next; // 保存当前节点的下一个节点
  15.         current->next = prev; // 将当前节点的下一个节点指向前一个节点,完成反转
  16.         prev = current; // 更新前一个节点为当前节点
  17.         current = nextNode; // 更新当前节点为下一个节点
  18.     }

  19.     return prev; // 返回反转后链表的头节点
  20. }

  21. int main() {
  22.     // 构造一个简单的链表:1 -> 2 -> 3 -> nullptr
  23.     ListNode* head = new ListNode(1);
  24.     head->next = new ListNode(2);
  25.     head->next->next = new ListNode(3);

  26.     // 反转链表并打印
  27.     ListNode* reversedHead = reverseList(head);
  28.     while (reversedHead != nullptr) {
  29.         std::cout << reversedHead->val << " -> ";
  30.         reversedHead = reversedHead->next;
  31.     }
  32.     std::cout << "nullptr" << std::endl;

  33.     return 0;
  34. }
复制代码

这个代码中,reverseList 函数首先初始化了 prev、current 和 nextNode 三个指针。然后通过一个 while 循环遍历链表中的每个节点,

将当前节点的 next 指针指向前一个节点以实现反转。在循环中,我们会更新 prev 和 current 指针以便处理下一个节点。

最后,当 current 指针指向 nullptr 时,循环结束,返回 prev 指针,即反转后链表的头节点。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-2 21:19:19 | 显示全部楼层    本楼为最佳答案   
在这个问题中,我们需要实现一个函数 reverseList,它接收一个链表的头指针,然后将链表反转。我们可以通过迭代或递归的方式来实现这个功能。这里,我将展示一种迭代的实现方法:

  1. #include <iostream>

  2. struct ListNode {
  3.     int val;
  4.     ListNode *next;
  5.     ListNode() : val(0), next(nullptr) {}
  6.     ListNode(int x) : val(x), next(nullptr) {}
  7.     ListNode(int x, ListNode *next) : val(x), next(next) {}
  8. };

  9. ListNode* reverseList(ListNode* head) {
  10.     ListNode* prev = nullptr; // 初始化前一个节点指针
  11.     ListNode* current = head; // 初始化当前节点指针
  12.     ListNode* nextNode = nullptr; // 初始化下一个节点指针

  13.     while (current != nullptr) {
  14.         nextNode = current->next; // 保存当前节点的下一个节点
  15.         current->next = prev; // 将当前节点的下一个节点指向前一个节点,完成反转
  16.         prev = current; // 更新前一个节点为当前节点
  17.         current = nextNode; // 更新当前节点为下一个节点
  18.     }

  19.     return prev; // 返回反转后链表的头节点
  20. }

  21. int main() {
  22.     // 构造一个简单的链表:1 -> 2 -> 3 -> nullptr
  23.     ListNode* head = new ListNode(1);
  24.     head->next = new ListNode(2);
  25.     head->next->next = new ListNode(3);

  26.     // 反转链表并打印
  27.     ListNode* reversedHead = reverseList(head);
  28.     while (reversedHead != nullptr) {
  29.         std::cout << reversedHead->val << " -> ";
  30.         reversedHead = reversedHead->next;
  31.     }
  32.     std::cout << "nullptr" << std::endl;

  33.     return 0;
  34. }
复制代码

这个代码中,reverseList 函数首先初始化了 prev、current 和 nextNode 三个指针。然后通过一个 while 循环遍历链表中的每个节点,

将当前节点的 next 指针指向前一个节点以实现反转。在循环中,我们会更新 prev 和 current 指针以便处理下一个节点。

最后,当 current 指针指向 nullptr 时,循环结束,返回 prev 指针,即反转后链表的头节点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 14:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表