LeetCode 206:反转链表 Reverse Linked List
反转一个单链表。
Reverse a singly linked list.
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
解题思路:
每次遍历到最后一位取节点这种方法就算了时间复杂度太高。如题目进阶要求的两种方法,迭代和递归:
迭代:
每次分出来一个节点把节点作为头节点添加到新链表上:
原链表:1->2->3->4->5
分离第一个节点作为头节点添加到新链表:1 原链表:2->3->4->5
分离下一个节点作为头节点添加到新链表:2->1 原链表:3->4->5
分离下一个节点作为头节点添加到新链表:3->2->1 原链表:4->5
分离下一个节点作为头节点添加到新链表:4->3->2->1 原链表:5
分离下一个节点作为头节点添加到新链表:5->4->3->2->1 原链表:null
Java:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode pre = null;
ListNode tmp = null;
while (head != null) {
tmp = head.next;//tmp暂存当前节点的下一个节点
head.next = pre;//当前节点下一个指向pre
pre = head;//刷新pre
head = tmp;//刷新当前节点为tmp
}
return pre;
}
}
Python3:
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
pre,tmp=None,None
while(head):
tmp=head.next
head.next=pre
pre=head
head=tmp
return pre
递归:
其实就是用递归完成栈的功能:先进后出
基线条件为遇到空节点(到链表末尾),返回对象为链表的最后一个节点,在递归函数中传递一直不变。从链表末尾向头部逐个分离节点,并将节点添加到新链表的末尾。与迭代法原理相似。
原链表:1->2->3->4->5
递归到最后一层时遇到null节点返回尾节点5
回到上一层递归 分离节点 5 作为新链表的尾节点:5,置空原本5节点,原链表1->2->3->4->null
回到上一层递归 分离节点 4 作为新链表的尾节点:5->4,置空原本4节点,原链表1->2->3->null
回到上一层递归 分离节点 3 作为新链表的尾节点:5->4->3,置空原本3节点,原链表1->2->null
回到上一层递归 分离节点 2 作为新链表的尾节点:5->4->3->2,置空原本2节点,原链表1->null
回到上一层递归 分离节点 1 作为新链表的尾节点:5->4->3->2->1,置空原本1节点,原链表null
Java:
class Solution {
public ListNode reverseList(ListNode head) {
//基线条件
if (head == null || head.next == null) return head;
//递归
ListNode tmp = head.next;//暂存头节点的下一个节点
ListNode pre = reverseList(head.next);//递归调用该函数,pre为返回的新链表的头节点,原链表的最后一个节点,无论递归多少层该返回值一直传递不变
tmp.next = head;//暂存的下一个节点指向传入节点
head.next = null;//下一个节点即原本指向tmp的节点 置空
return pre;
}
}
Python3:
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
tmp = head.next
pre = self.reverseList(head.next)
tmp.next = head
head.next = None
return pre
欢迎关注公.众号一起刷题:爱写Bug

LeetCode 206:反转链表 Reverse Linked List的更多相关文章
- LeetCode 206. 反转链表(Reverse Linked List) 16
206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ...
- leetcode 206 反转链表 Reverse Linked List
C++解法一:迭代法,使用前驱指针pre,当前指针cur,临时后继指针nxt: /** * Definition for singly-linked list. * struct ListNode { ...
- 每天一道面试题LeetCode 206 -- 反转链表
LeetCode206 反转链表 思路 代码 # # @lc app=leetcode.cn id=206 lang=python3 # # [206] 反转链表 # # https://leetco ...
- leetCode:206 反转链表
206. 反转链表 题目:反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 非递归代码: class Solution { public ListNode reverseLis ...
- Java实现 LeetCode 206 反转链表
206. 反转链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL ...
- leetcode 206. 反转链表 及 92. 反转链表 II
206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...
- [Swift]LeetCode206. 反转链表 | Reverse Linked List
Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4-> ...
- 反转链表 Reverse Linked List
2018-09-11 22:58:29 一.Reverse Linked List 问题描述: 问题求解: 解法一:Iteratively,不断执行插入操作. public ListNode reve ...
- LeetCode 206.反转链表(Python3)
题目: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶:你可 ...
随机推荐
- python 学习(day1)
初识python python的创始人为吉多*范罗苏姆(Guido van Rossum).1989年圣诞节期间,开发出来的脚本解释程序. python是⼀⻔什么样的语言 python 是一门解释型语 ...
- mosquitto配置文件
#配置文件为mosquitto #参见mosquitto.conf(5)了解更多信息. #显示默认值,取消注释以更改. #使用#字符来表示注释,但只有当它是 #第一个字符就行了. #========= ...
- Ganglia+Nagios监控系统
第1章 简介 ganglia是一款为HPC(高性能计算) 集群设计的可扩展性 的分布式监控系统,它可以监视和显示集群中节点的各种状态信息,他由运行在各个节点上的gmond守护进程来采集 CPU.内存. ...
- JS实现根据两点位置的经纬度获取距离
// 经纬度转换成三角函数中度分表形式. function rad(d) { return d * Math.PI / 180.0; } // 根据经纬度计算距离,参数分别为第一点的纬度,经度:第二点 ...
- mysql - 锁及事务的认识
mysql事务特性:一致性原子性隔离性持久性 //mysql 事务隔离级别 读未提交 读未提交的数据 读已提交 读已提交的数据 串行序列化 一个事务完成了再执行另一个事务 可重复读(数据库默认) 就算 ...
- Python工具库分享
漏洞及渗透练习平台: WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.co ...
- INSTALL_FAILED_NO_MATCHING_ABIS解决办法
解决方法: 在project切换到Android状态下的build.grade(Module:app)中添加如下内容即可: splits { abi { enable true reset() inc ...
- Python对csv文件的读写操作
python内置了csv模块,用它可以方便的操作csv文件. 1.写文件 (1)写文件的方法一 import csv # open 打开文件有多种模式,下面是常见的4种 # r:读数据,默认模式 # ...
- Gatech OMSCS的申请和学习之奥妙
https://zhuanlan.zhihu.com/p/54680585 我写东西一向希望能给大家带来正能量,提供有价值的信息,不辱没母校的厚德价值观. 我是传统没落工科毕业后开发软件,但是一直没下 ...
- 每天一点产品思考(5):Web端链接跳转在当前页面刷新还是新标签页打开?
一.与交互设计师的突然撕逼 今天阿白在验收产品的时候,在博客首页打开一篇博文,是在原先的页面进行刷新,而不是新开一个标签页打开.阿白让开发改成在新标签页中打开,但是开发说这是设计师设计 ...