当前位置: 首页 > article >正文

力扣力扣力:206. 反转链表

leetcode链接:206. 反转链表

题目描述:

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

 

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

 

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

 

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

分析思路:

第一反应是分类讨论

1.如果是空则直接返回

2.如果只有一个也直接返回

3.大于等于2个元素则进行反转

        1)可以new一个链表来倒着存值

        2)在原链表上进行操作

  实现1

在原链表上进行修改:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr)
        {
            return head;
        }
        else
        {
            ListNode* cur = head;
            ListNode* prev = nullptr;
            while(cur)
            {   
                ListNode* nextnode = cur->next;
                cur->next = prev;
                prev = cur;
                cur = nextnode;
            }
            return prev;
        }
    }
};

实现2:在原链表上操作

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == nullptr) {
            return head;
        }

        ListNode* prev = nullptr; // 先初始化为 nullptr
        ListNode* cur = head;

        while (cur != nullptr) {
            ListNode* front = cur->next; // 保存下一个节点
            cur->next = prev; // 反转当前节点的指向
            prev = cur; // 移动 prev
            cur = front; // 移动到下一个节点
        }
        return prev; // prev 现在是新的头节点
    }
};

需要注意的是,这里有个常见错误,下面我在写这道题的时候就已经犯了,不能在循环外先定义front,这是因为会存在一种情况只有一个结点,这时我这种写法就已经错了造成空指针问题了。

实现3:递归

这里引用一篇题解的动图来说明递归的实现过程下面是原文链接
:206. 反转链表 - 力扣(LeetCode)

这里举一个官方题解下的评论来具体来说明一下调用过程:

 第一轮出栈,head5head.next为空,返回5
 第二轮出栈,head4head.next为5,执行head.next.next=head也就是5.next=4
                      把当前节点的子节点的子节点指向当前节点
                      此时链表为
1->2->3->4<->5,由于45互相指向,所以此处要断开4.next=null
                      此时链表为1->2->3->4<-5
                      返回节点5
 第三轮出栈,head3head.next为4,执行head.next.next=head也就是4.next=3
                      此时链表为
1->2->3<->4<-5,由于34互相指向,所以此处要断开3.next=null
                      此时链表为1->2->3<-4<-5
                      返回节点5
 第四轮出栈,head2head.next为3,执行head.next.next=head也就是3.next=2
                      此时链表为
1->2<->3<-4<-5,由于23互相指向,所以此处要断开2.next=null
                      此时链表为1->2<-3<-4<-5
                      返回节点5
 第五轮出栈,head1head.next为2,执行head.next.next=head也就是2.next=1
                      此时链表为
1<->2<-3<-4<-5,由于12互相指向,所以此处要断开1.next=null
                      此时链表为1<-2<-3<-4<-5
                      返回节点5

出栈完成,最终头节点5->4->3->2->1


http://www.kler.cn/news/362004.html

相关文章:

  • Git_IDEA集成Git
  • elementUI进度条el-progress不显示白色
  • 新书速览|Android智能座舱开发:从源码到实践
  • 数据结构与算法:贪心算法与应用场景
  • 漏洞挖掘 | 基于mssql数据库的sql注入
  • 浏览器任务调度API
  • java项目结构说明
  • scrapy的xpath在控制台可以匹配,但是到了代码无法匹配(无法匹配tbody标签)
  • 金融行业:办公安全防护专属攻略
  • 三、MyBatis实践(2):MyBatis基本使用
  • 中国云厂出海:如何绕过暗礁,找到宝藏?
  • 10·24程序员节的思考:代码编织梦想,技术点亮未来
  • HBuilder X 中Vue.js基础使用1(三)
  • Vue学习一
  • 萤石云服务支持云端视频AI自动剪辑生成
  • 前端-基础CSS总结常用
  • LTE 基于快速hadamard变换FHT SSS辅同步信号检测之--M序列与hadamard变换的关系
  • uniapp修改input中placeholder样式
  • 学习笔记——交换——STP(生成树)桥协议数据单元(BPDU)
  • HTTPS关键考点(HTTPS Key Exam Points)
  • VOIDMAW:一种可用于绕过内存扫描器的新技术
  • [单调栈] 统计点数
  • 如何使用 matplotlib 在 Python 3 中绘制数据
  • 定制开发 AI 智能名片 S2B2C 商城系统小程序:选择靠谱第三方开发商的重要性
  • 给el-dialog的整体加动态class
  • Hadoop 3.4.0 安装与WordCount示例