ZBLOG

链表反转

链表反转是一个常见的算法问题,通常用于考察对链表操作的理解。下面是反转单链表的基本思路和实现方法。

反转单链表的思路

  1. 使用三个指针

    • prev:初始化为 nullptr,用于存储已反转部分的尾节点。
    • curr:初始化为头节点,用于遍历链表。
    • next_temp:用于临时保存当前节点的下一个节点。
  2. 遍历链表

    • 在循环中,将当前节点的下一个指针指向前一个节点,然后更新指针,使其移动到下一个节点。
  3. 结束条件

    • currnullptr 时,说明遍历完了整个链表,此时 prev 就是新的头节点。

C++ 实现

#include <iostream>

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = nullptr; // 初始化 prev 为 nullptr
        ListNode* curr = head;    // 当前节点从头开始
        
        while (curr != nullptr) {  // 遍历链表
            ListNode* next_temp = curr->next; // 保存下一个节点
            curr->next = prev;     // 将当前节点的 next 指向前一节点
            prev = curr;           // 移动 prev 到当前节点
            curr = next_temp;      // 移动到下一个节点
        }
        
        return prev;               // 返回新的头部(即原来的尾部)
    }
};

// 辅助函数用来创建和打印链表(可选)
void printList(ListNode* head) {
    while (head != nullptr) {
        std::cout << head->val << " -> ";
        head = head->next;
    }
    std::cout << "nullptr" << std::endl;
}

int main() {
    // 创建测试用例: 1 -> 2 -> 3 -> nullptr
    ListNode* head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);

    std::cout << "Original list: ";
    printList(head);

    Solution solution;
    ListNode* reversedHead = solution.reverseList(head);

    std::cout << "Reversed list: ";
    printList(reversedHead);

    return 0;
}

输出结果

运行上面的代码将输出:

Original list: 1 -> 2 -> 3 -> nullptr
Reversed list: 3 -> 2 -> 1 -> nullptr

总结

  • 使用三个指针的方法能够有效地反转单链表,时间复杂度为 O(n),空间复杂度为 O(1)。
  • 确保在使用指针时处理好边界条件,以避免出现空指针异常。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21450

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?