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

示例:

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

题解

使用头插法原地逆置链表。为了便于操作,首先定义一个哑节点。然后从第一个节点开始,依次头插到头节点的后面,直到最后一个节点,从而实现链表的原地逆置。

具体来说,当前节点不为空时,用r指针保存下一个节点,然后将当前节点的next指针指向dummy的下一个节点,然后dummy的next指针指向当前节点,再将当前指针指向r指针保存的节点。

时间复杂度为O(n),空间复杂度为 O(1)。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:# 返回ListNodedef ReverseList(self, pHead):# write code heredummy = ListNode(0)while pHead:r = pHead.nextpHead.next = dummy.nextdummy.next = pHeadpHead = rreturn dummy.next

题解

递归法

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:# 返回ListNodedef ReverseList(self, pHead):# write code hereif not pHead or not pHead.next:return pHeadelse:newHead = self.ReverseList(pHead.next)pHead.next.next=pHeadpHead.next=Nonereturn newHead

代码详解分析

1. 首先找到递归的出口

就是找到链表最后一个节点(尾结点),我们要反转当前的链表,就必须从尾结点开始,因为链表的性质就是:

通过头结点来找到后面的节点进行操作,CRUD都需要从头结点开始找。

找到当前链表的尾结点,就是反转后链表的头结点(先不考虑头结点是否设立标兵)。

if(head == null || head.next == null)

这个条件对应两种情况:

1当链表只有空结点时:

2链表到尾结点时

以上这两种情况都归纳为寻找链表的尾结点

2. 递和归

为了形象的让大家理解这个过程,我们先以求阶乘为例:

递就是拆分子问题

注意点

  • 递归函数必须要有终止条件,否则会出错;
  • 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案

参考

[链表] --- 反转链表(leetcode 206)相关推荐

  1. 【编程2】单链表+单链表反转(LeetCode. 206)

    文章目录 一.链表 二.单链表 1.基本概念 (1)单链表 (2)头指针--必有元素 (3)头结点--非必需元素 (4)尾结点 2.查找操作 3.插入操作 4.删除操作 三.设计思想-- 时间 < ...

  2. 26. Leetcode 206. 反转链表 (链表-反转链表)

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表.示例 1:输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:输入:head = [1,2] 输出:[ ...

  3. 28. Leetcode 25. K 个一组翻转链表 (链表-反转链表)

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一 ...

  4. 27. Leetcode 92. 反转链表 II (链表-反转链表)

    给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 .示例 1 ...

  5. Java~链表反转/链表逆置的多种方法(超详细,含完整代码)

    单链表的反转,有一个单链表,我们要如何对他进行反转呢?这里我们以leetcode--206为例子 附上题目链接力扣https://leetcode-cn.com/problems/reverse-li ...

  6. (链表)反转链表Reverse List

    逆转链表是简单而又简单的链表问题,其问题的方法之一可以设置三个指针,一个指向当前结点,一个指向前驱结点,一个指向后继指针 代码如下: class Solution { public:ListNode* ...

  7. [链表]链表寻找中间点环形链表反转链表

    链表: 是一种物理储存结构上的非连续储存结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的. 知道头节点便可以访问链表中的所有节点. 如下代码创建链表类,并访问: package list; p ...

  8. 七十、反转和合并链表、 链表有环的判断

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解 ...

  9. C语言链表逆序复杂度为o1,C链表反转(时间复杂度O(n))

    面试的时候经常会出现的问题,现在都做一遍,回忆一下,练练手. 这个题目需要注意两点: 1.head->next 要先设置为NULL ,否则反转后,它还是指向之前的next节点 2.需要有一个tm ...

最新文章

  1. RabbitMQ安装和运行
  2. 二.Sql语言的分类及运算符
  3. 如何在不亏本的情况下构建道德数据科学系统?
  4. Java使用iText生成word文件的完美解决方案(亲测可行)
  5. linux命令系列-zip(压缩打包)
  6. myeclipse-common 找不到
  7. #if、#ifdef、#if defined之间的区别
  8. Java基础教程【第二章:Java数据类型和变量】
  9. 基于socketserver实现并发的socket编程
  10. 前端js-angluar定时刷新器
  11. 计算机组成原理地址线不够,计算机组成原理小结和习题2
  12. 用直接分解法求方程组的C语言程序,LU分解法解线性方程组(C语言)
  13. 服务器pe系统ghost系统安装教程,U盘PE启动安装GHOST系统图文教程
  14. Web前端开发-网页制作零基础入门-Dreamweaver2019+HTML+CSS视频教程
  15. 原创|批处理实现安卓设备自动重启压力测试(自动生成日志和计算重启时间)
  16. 大揭秘(1):网店背后的隐秘产业链【连载】
  17. MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)(附matlab实现代码)
  18. Excel批量合并相同表头的表格
  19. Isomorphic 同构树(图)的实现
  20. tomcat版本和支持的jdk版本匹配表

热门文章

  1. 如何设计良好的viewcontroller
  2. 5G时代即将来临,三大运营商各自为营谁能抢占先机?
  3. Java解析XMl文件之SAX和DOm方法
  4. [搜索]Trie树的实现
  5. 摘:常用函数(包括:宽字符函数、普通C函数 )
  6. extjs 页面打开时表格自动加载后台传来的json数据
  7. 2011-09-07 00:16 ubuntu 如何修改当前用户名
  8. MySQL数据库迁移到PostgreSQL
  9. Infobright 数据仓库心得总结
  10. 深入update语句(延伸学习)