206. 反转链表[简单]

题目

在这里插入图片描述

菜鸟解答
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head){                                                            
    struct ListNode *scan ,*prev,*next;

    if (NULL == head || NULL == head->next) {
        return head;
    }

    prev = head;
    scan = head->next;
    head->next = NULL;

    while(scan != NULL) {
        next = scan->next;
        scan->next = prev;
        prev = scan;
        scan = next;
    }
   return prev;
}

评论区官方解答

原链接为https://leetcode-cn.com/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode/

迭代法,即同上

复杂度分析 :
时间复杂度:O(n)O(n),假设 nn 是列表的长度,时间复杂度是 O(n)O(n)。
空间复杂度:O(1)O(1)

递归法

从复杂度上不是最优,但是思路 ORZ

在这里插入图片描述

自行想了半天写不出递归解法,看了官网代码还要理解一会…ORZ

假设 N1->N2->N3
N1 :第一层调用
p = R(N1->next)=R(N2)
-> p = N3
N1->next->next =N2->next =head = N1
N1->next = NULL
return p=N3

N2 : 第二层调用
p = R(N2->next)=R(N3) -> p = N3
N2->next->next =N3->next =head = N2
N2->next = NULL
return p=N3

N3 : 第三层调用
∵ N3->next == NULL ∴ return head = N3

/*递归的实现 在当前节点需要做什么翻转操作: 当前节点的下一个节点的next要重定向为当前节点  当前节点的下一个节点置null 由其上一层节点重新赋值*/
struct ListNode* reverseList(struct ListNode* head){                                                            

    struct ListNode *last = NULL;

    if (NULL == head || NULL == head->next) {
        return head;
    }

    last = reverseList(head->next); /*最后一层的时候 last->next = null 所以return last 到倒数第二层*/

    head->next->next = head;
    head->next = NULL;
    return last; /*一直返回last 变为首节点*/
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值