当前位置: 首页 > article >正文

LeetCode 206 题:反转链表

LeetCode 206 题:反转链表(Reverse Linked List)

题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。


代码实现

以下是反转单链表的 C 语言实现:

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
struct ListNode {
    int val;
    struct ListNode* next;
};

// 反转链表函数
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* prev = NULL;  // 初始化前驱节点为 NULL
    struct ListNode* curr = head; // 当前节点指向链表头部

    while (curr != NULL) {         // 遍历链表直到当前节点为 NULL
        struct ListNode* nextTemp = curr->next; // 暂存当前节点的下一节点
        curr->next = prev;        // 当前节点的指针指向前驱节点
        prev = curr;              // 前驱节点前移
        curr = nextTemp;          // 当前节点后移
    }

    return prev;                  // 返回新链表的头节点
}

测试主函数

以下是用于验证反转链表函数的主函数:

// 创建新节点
struct ListNode* createNode(int val) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// 打印链表
void printList(struct ListNode* head) {
    struct ListNode* current = head;
    while (current != NULL) {
        printf("%d -> ", current->val);
        current = current->next;
    }
    printf("NULL\n");
}

// 测试主函数
int main() {
    // 创建链表:1 -> 2 -> 3 -> 4 -> 5 -> NULL
    struct ListNode* head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(4);
    head->next->next->next->next = createNode(5);

    printf("原链表: ");
    printList(head);

    // 反转链表
    struct ListNode* reversedHead = reverseList(head);

    printf("反转后的链表: ");
    printList(reversedHead);

    return 0;
}

逐行讲解代码

1. 链表节点定义
struct ListNode {
    int val;
    struct ListNode* next;
};
  • 定义链表的基本节点结构,包括节点的值 val 和指向下一个节点的指针 next
2. 反转链表函数
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* prev = NULL;  // 初始化前驱节点为 NULL
    struct ListNode* curr = head; // 当前节点指向链表头部
  • prev 表示前驱节点,初始为空。
  • curr 表示当前节点,初始为链表头部。
    while (curr != NULL) {         // 遍历链表直到当前节点为 NULL
        struct ListNode* nextTemp = curr->next; // 暂存当前节点的下一节点
        curr->next = prev;        // 当前节点的指针指向前驱节点
        prev = curr;              // 前驱节点前移
        curr = nextTemp;          // 当前节点后移
    }
  • 暂存当前节点的下一节点 nextTemp,以免断链。
  • 将当前节点的指针指向前驱节点,实现反转。
  • 更新前驱节点和当前节点,准备进入下一步。
    return prev;                  // 返回新链表的头节点
}
  • 最后返回 prev,即反转后的链表头节点。
3. 测试链表操作
创建新节点
struct ListNode* createNode(int val) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}
  • 动态分配内存,创建链表节点,并初始化其值。
打印链表
void printList(struct ListNode* head) {
    struct ListNode* current = head;
    while (current != NULL) {
        printf("%d -> ", current->val);
        current = current->next;
    }
    printf("NULL\n");
}
  • 遍历链表节点并打印其值,直到链表尾部。
测试主函数
int main() {
    // 创建链表:1 -> 2 -> 3 -> 4 -> 5 -> NULL
    struct ListNode* head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(4);
    head->next->next->next->next = createNode(5);
  • 创建一个简单的链表用于测试反转函数。
    printf("原链表: ");
    printList(head);

    // 反转链表
    struct ListNode* reversedHead = reverseList(head);

    printf("反转后的链表: ");
    printList(reversedHead);
}
  • 打印原链表,调用 reverseList 函数,并打印反转后的链表。

运行结果

运行上述代码,输出结果如下:

原链表: 1 -> 2 -> 3 -> 4 -> 5 -> NULL
反转后的链表: 5 -> 4 -> 3 -> 2 -> 1 -> NULL

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n 为链表节点数。每个节点遍历一次。
  • 空间复杂度 O ( 1 ) O(1) O(1),仅使用了几个指针变量。

http://www.kler.cn/a/515501.html

相关文章:

  • 土壤墒情中土壤 pH 值的监测方法与意义
  • STM32-CAN总线
  • 最小距离和与带权最小距离和
  • 62,【2】 BUUCTF WEB [强网杯 2019]Upload1
  • 【深度学习】Java DL4J 2024年度技术总结
  • 机器学习10-解读CNN代码Pytorch版
  • SpringBoot 实现动态管理定时任务 Job的动态操作(添加、修改、启停、执行、删除)以及界面展示和具体Job的创建与执行示例
  • 使用sql查询excel内容
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)
  • Django 的 `Meta` 类和外键的使用
  • 数据分析 变异系数
  • 设计模式-模板方法实现
  • css普通用法
  • APL语言的物联网
  • epoll 的边缘触发(Edge Triggered)与水平触发(Level Triggered)
  • 不同IO模型服务器的简单实现
  • 【R语言】数学运算
  • 迷你世界玩家准备界面UI设计制作触发器
  • QT+VS2022 应用程序无法启动0x000007b问题记录
  • Linux环境部署——MySQL忘记密码
  • 【Java】Java抛异常到用户界面公共封装
  • 分享一款WebSocket在线测试工具,使用简单方便
  • 《探秘:人工智能如何为鸿蒙Next元宇宙网络传输与延迟问题破局》
  • springBoot tomcat
  • 【玩转全栈】----用户管理案例
  • 信号失真度测试仪、音频失真度测试仪、失真度仪、全自动数字失真度测量仪