资讯专栏INFORMATION COLUMN

剑指offer系列——剑指 Offer 24. 反转链表(C语言)

weakish / 3283人阅读

摘要:假设反转对象节点为,反转指向的结点为,反转后指向的结点为首结点。当然也可以根据栈先进后出的特点,使用栈反转链表。

⭐️前面的话⭐️

大家好!博主开辟了一个新的专栏——剑指offer,我要开始刷题了!这个专栏会介绍《剑指offer》书上所有的面试编程题。并且会分享一些我的刷题心得。由于博主水平有限,如有错误,欢迎指正,如果有更好的解题思路和算法可以分享给博主哦!一起加油!一起努力!

?博客主页:未见花闻的博客主页
?欢迎关注?点赞?收藏⭐️留言?
?本文由未见花闻原创,CSDN首发!
?首发时间:?2021年9月2日?
✉️坚持和努力一定能换来诗与远方!
?参考书籍:?《剑指offer第1版》,?《剑指offer第2版》
?参考在线编程网站:?牛客网?力扣
?作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
博主的码云gitee,平常博主写的程序代码都在里面。


⭐️剑指 Offer 24. 反转链表⭐️

?题目详情

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/

?解题思路

方法1: 双指针迭代法。
假设反转对象节点为cur,反转指向的结点为tail,反转后tail指向的结点为首结点。具体过程如下图:

时间复杂度: O(N)

方法2: 递归法。
简单来说就是先递进至最后一个结点,使最后一个结点为反转链表的头结点,然后在归出的过程中是后面的结点指向前面的结点,前面的结点指向空,最终实现链表反转。

时间复杂度: O(N)

?源代码

编程语言:C语言
在线编程平台:力扣

//方法1/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */struct ListNode* reverseList(struct ListNode* head){    if (head == NULL)        return NULL;    struct ListNode* cur = head;//反转对象节点,初始化第1个结点    struct ListNode* next = NULL;//储存cur下一个结点    struct ListNode* tail = NULL;//cur前插对象节点,反转后为反转链表的首结点            while (cur)    {        next = cur->next;        cur->next = tail;//进行前插        tail = cur;        cur = next;    }    return tail;}
//方法2struct ListNode* reverseList(struct ListNode* head){    /* 特判 */    if (head == NULL || head->next == NULL) {        return head;    }    //长度为n的链表,从最后一个结点开始需要进行n-1次反转操作    //从第一个结点到最后一个结点,会进入n次reverseList()函数,除去最后一次结点只会返回最后一个结点外,其他都会进行链表结点反转    //首先递进至最后一个结点,并保存这个结点作为反转链表后的头结点    struct ListNode *next = head->next;    struct ListNode *node = reverseList(next);     /* 归出过程中,每一次将结点反转 */         next->next = head;     /* 被指向的结点指向空 */                                head->next = NULL;                                       return node;}

?总结

对于链表的反转可以使用头插法或者递归实现。当然也可以根据栈先进后出的特点,使用栈反转链表。

觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119008.html

相关文章

  • 剑指offer系列——剑指 Offer 06. 从尾到头打印链表C语言

    摘要:导航小助手剑指从尾到头打印链表题目详情解题思路源代码总结剑指从尾到头打印链表题目详情输入一个链表的头节点,从尾到头反过来返回每个节点的值用数组返回。时间复杂度方法先反转链表并求长度,在将反转后的链表数据拷贝至数组中。 ...

    DevTTL 评论0 收藏0
  • 剑指offer反转链表(Java)

    摘要:问题描述输入一个链表,反转链表后,输出新链表的表头。通过循环遍历当前链表,在遍历过程中反转链表,当前节点遍历到最后为时,循环停止,此时当前节点为,所以它的前一个节点就是新链表的第一个节点。 1.问题描述 输入一个链表,反转链表后,输出新链表的表头。 2.思路 首先要判断给出的头节点是否为空,如果为空直接返回,如果不为空才可以进行反转。因为每个节点只有一个next指针记录它的下一个节点...

    stonezhu 评论0 收藏0
  • LeetCode 精选TOP面试题【51 ~ 100】

    摘要:有效三角形的个数双指针最暴力的方法应该是三重循环枚举三个数字。总结本题和三数之和很像,都是三个数加和为某一个值。所以我们可以使用归并排序来解决这个问题。注意因为归并排序需要递归,所以空间复杂度为 ...

    Clect 评论0 收藏0

发表评论

0条评论

weakish

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<