[链表] --- 反转链表(leetcode 206)
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 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)相关推荐
- 【编程2】单链表+单链表反转(LeetCode. 206)
文章目录 一.链表 二.单链表 1.基本概念 (1)单链表 (2)头指针--必有元素 (3)头结点--非必需元素 (4)尾结点 2.查找操作 3.插入操作 4.删除操作 三.设计思想-- 时间 < ...
- 26. Leetcode 206. 反转链表 (链表-反转链表)
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表.示例 1:输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:输入:head = [1,2] 输出:[ ...
- 28. Leetcode 25. K 个一组翻转链表 (链表-反转链表)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一 ...
- 27. Leetcode 92. 反转链表 II (链表-反转链表)
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 .示例 1 ...
- Java~链表反转/链表逆置的多种方法(超详细,含完整代码)
单链表的反转,有一个单链表,我们要如何对他进行反转呢?这里我们以leetcode--206为例子 附上题目链接力扣https://leetcode-cn.com/problems/reverse-li ...
- (链表)反转链表Reverse List
逆转链表是简单而又简单的链表问题,其问题的方法之一可以设置三个指针,一个指向当前结点,一个指向前驱结点,一个指向后继指针 代码如下: class Solution { public:ListNode* ...
- [链表]链表寻找中间点环形链表反转链表
链表: 是一种物理储存结构上的非连续储存结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的. 知道头节点便可以访问链表中的所有节点. 如下代码创建链表类,并访问: package list; p ...
- 七十、反转和合并链表、 链表有环的判断
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解 ...
- C语言链表逆序复杂度为o1,C链表反转(时间复杂度O(n))
面试的时候经常会出现的问题,现在都做一遍,回忆一下,练练手. 这个题目需要注意两点: 1.head->next 要先设置为NULL ,否则反转后,它还是指向之前的next节点 2.需要有一个tm ...
最新文章
- RabbitMQ安装和运行
- 二.Sql语言的分类及运算符
- 如何在不亏本的情况下构建道德数据科学系统?
- Java使用iText生成word文件的完美解决方案(亲测可行)
- linux命令系列-zip(压缩打包)
- myeclipse-common 找不到
- #if、#ifdef、#if defined之间的区别
- Java基础教程【第二章:Java数据类型和变量】
- 基于socketserver实现并发的socket编程
- 前端js-angluar定时刷新器
- 计算机组成原理地址线不够,计算机组成原理小结和习题2
- 用直接分解法求方程组的C语言程序,LU分解法解线性方程组(C语言)
- 服务器pe系统ghost系统安装教程,U盘PE启动安装GHOST系统图文教程
- Web前端开发-网页制作零基础入门-Dreamweaver2019+HTML+CSS视频教程
- 原创|批处理实现安卓设备自动重启压力测试(自动生成日志和计算重启时间)
- 大揭秘(1):网店背后的隐秘产业链【连载】
- MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)(附matlab实现代码)
- Excel批量合并相同表头的表格
- Isomorphic 同构树(图)的实现
- tomcat版本和支持的jdk版本匹配表
热门文章