自学内容网 自学内容网

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),仅使用了几个指针变量。

原文地址:https://blog.csdn.net/weixin_48941116/article/details/145235260

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!