链表 - 206. 反转链表(C#和C实现)

链表 - 206. 反转链表(C#和C实现)

题目描述

反转一个单链表。

解题思路

使用迭代或递归的方式来反转链表。

解题步骤

迭代方法:

  1. 初始化三个指针:prev(前一个节点)、curr(当前节点)、next(下一个节点)。
  2. 遍历链表,每次将当前节点的 next 指向前一个节点,然后更新 prevcurrnext 的位置。
  3. curr 到达链表末尾时,返回新的头节点。

递归方法:

  1. 使用递归反转链表,递归的终止条件是当前节点为 null 或者 next 节点为 null
  2. 在递归过程中,将当前节点的 next 指向前一个节点,然后返回新的头节点。

C#代码实现(迭代方法)

public ListNode ReverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;

    while (curr != null) {
        ListNode next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }

    return prev;
}

C代码实现(迭代方法)

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* prev = NULL;
    struct ListNode* curr = head;

    while (curr != NULL) {
        struct ListNode* next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }

    return prev;
}

C#代码实现(递归方法)

public ListNode ReverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }

    ListNode newHead = ReverseList(head.next);
    head.next.next = head;
    head.next = null;

    return newHead;
}

C代码实现(递归方法)

struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }

    struct ListNode* newHead = reverseList(head->next);
    head->next->next = head;
    head->next = NULL;

    return newHead;
}

时间复杂度和空间复杂度

  • 时间复杂度:O(n),其中 n 是链表的长度。每个节点最多被访问一次。
  • 空间复杂度:O(1)。除了常数级别的变量,算法的空间复杂度是常数级别的。

参与点评

读者朋友们,如果您在阅读过程中,对文章的质量、易理解性有任何建议,欢迎在评论区指出,我会认真改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmHardy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值