反转链表——C语言经典单链表题目

首先,把oj题目的链接放在这,大家可以先去练习一下,再来看解析。

反转链表——力扣


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

 


现在让我们来看一下解决代码,先看一下我写的代码。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){

    struct ListNode* tmp = NULL;//一个新的链表,来存储翻转时的链表。
    struct ListNode* newhead = head;//一般我们都会创建一个新的指针来指向链表。
    while(newhead)
    {
        struct ListNode* nexthead = newhead->next;//让nexthead指向下一个节点。
        newhead->next = tmp;//让下一个节点等于tmp,第一次相当于将第一个节点的next=NULL,第二次以后就相当于将newhead->next链接到翻转后的链表,然后依次链接。
        tmp = newhead;//让tmp来接收翻转后的链表
        newhead = nexthead;//再让newhead进行下一个节点的翻转。
    }
    return tmp;
}

        这是一种依次翻转,然后链接的方法。

        其空间复杂度是:O(1);

            时间复杂度是:O(N)。


现在让我们来看一下它的详细讲解,其实我在代码旁边的注释已经十分清楚了,但是让我们来看一下图,可以更清晰的理解它。 

首先:第一次翻转

这个时候tmp的具体指向就是:1-NULL。

 然后,就是不断的翻转,存储,最后返回。

 后面就是不断的重复这个过程。

 


当然它还有其他的方法,具体的可以看力扣或者其他的讲解,我这边就放一下代码。

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;
}

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/
来源:力扣(LeetCode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值