前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学长冷月带你怒刷LeetCode之反转链表

学长冷月带你怒刷LeetCode之反转链表

作者头像
学长冷月
发布2020-08-02 16:08:57
3180
发布2020-08-02 16:08:57
举报

01

前言

链表的操作是数据结构中最基础的算法之一,反转列表也是一道经典的笔试题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。本题选自leetcode的206题,感兴趣的小伙伴可以去练习一下。206.反转链表

02

题目描述

反转一个单链表。

示例:

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

03

冷月题解

因为是操作单链表,而单链表是单向指向的,如果要求空间复杂度为O(1)的情况下,我们只能使用迭代的方式。需要新增加两个指针。冷月把完整实例代码放在博客上了,大家可以进入查看学长冷月带你怒刷LeetCode之反转链表

代码语言:javascript
复制
struct ListNode * cur = head; //指向当前节点
代码语言:javascript
复制
struct ListNode * pre = NULL; //指向上一个节点

一开始,我们链表是如下的形式:

此时head不为空,我们进入第一次循环。

代码语言:javascript
复制
head = head -> next; //指向下一个结点

代码语言:javascript
复制
cur->next = pre; //当前节点 指向 上一个节点

如下图所示:

这时,我们已经将第一个节点指向了pre,也就是说将第一个节点反转了过来,下一步我们要将pre和cur移动一下位置,方便下一次循环。

代码语言:javascript
复制
pre = cur; //指针域往后挪动cur = head; //指针域往后挪动

如下图所示:

这时已经完成了第一次循环的所有步骤,我们成功将第一个节点反转,并且从第二个节点开始成为了新的表头,大家可以与第一张图片对比一下,是不是很相似呢?然后进入第二次循环,循环的步骤方法和第一次的一模一样,第二次循环完后的图示如下:

再经过四次循环后,cur = head = NULL,将会跳出循环,我们只需要将pre 返回出去即可,获得反转后的链表。图示如下:

完整代码如下:

代码语言:javascript
复制
/**
公众号:学长冷月
**/
struct ListNode* reverseList(struct ListNode* head){
     struct ListNode * cur = head;  //指向当前节点
     struct ListNode * pre = NULL; //指向上一个节点

    while(head){ //如果链表不为空则进入循环
        head = head -> next; //指向下一个结点
        cur->next = pre; //当前节点 指向 上一个节点
        pre = cur; //指针域往后挪动
        cur = head; //指针域往后挪动
    }
    return pre;
}

03

总结一下

这道反转链表的题属于很基础的入门题,是每位小伙伴都应该掌握的难度。光说不练假把式,大家要先理解,然后将代码自己实现一下才能将知识转变成自己的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 学长冷月 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 冷月题解
  • 总结一下
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档