鱼C论坛

 找回密码
 立即注册
查看: 1242|回复: 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,它接收一个链表的头指针,然后将链表反转。我们可以通过迭代或递归的方式来实现这个功能。这里,我将展示一种迭代的实现方法:
#include <iostream>

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) {
    ListNode* prev = nullptr; // 初始化前一个节点指针
    ListNode* current = head; // 初始化当前节点指针
    ListNode* nextNode = nullptr; // 初始化下一个节点指针

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

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

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

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

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

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

最后,当 current 指针指向 nullptr 时,循环结束,返回 prev 指针,即反转后链表的头节点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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) {
    ListNode* prev = nullptr; // 初始化前一个节点指针
    ListNode* current = head; // 初始化当前节点指针
    ListNode* nextNode = nullptr; // 初始化下一个节点指针

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

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

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

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

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

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

最后,当 current 指针指向 nullptr 时,循环结束,返回 prev 指针,即反转后链表的头节点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 17:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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