题目

难度:★★☆☆☆

类型:链表

反转一个单链表。

进阶:

你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

示例

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

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

解答

方案1:迭代

使用迭代法反转链表需要三个临时变量:

当前结点cur:当前要处理的链表结点;

前一个结点prev:已经处理好的新链表的头结点;

临时结点tmp:用于暂存cur的下一个链表结点。

遍历链表过程中,不断进行的重复便是cur.next=prev:

prev, cur->tmp ==> prev <- cur, tmp

每一轮循环,因为有三个变量,所以需要三句话分别更新,链表方向调头工序夹在里面:

先把当前结点cur的下一个结点赋给临时结点tmp暂存;

将当前结点的连接方向调头,连接prev,cur成为新链表的头结点;

prev结点更新为新链表的头结点;

将tmp中暂存的变量归还cur结点。

class Solution(object): # 迭代

def reverseList(self, head):

"""

:type head: ListNode

:rtype: ListNode

"""

cur, prev = head, None

while cur:

tmp = cur.next # 临时列表,用于暂存结果

cur.next = prev # 更换连接方向

prev = cur # 后移

cur = tmp # 后移

return prev

方案2:递归

假设链表为:

1 -> 2 -> 3-> ... -> k-1 -> k -> k+1 -> ... -> n -> None

并且我们已经构造了函数,使得链表从k-1之后都被反转:

1 -> 2 -> 3-> ... ->k-1 -> k -> k+1 <- ... <- n

我们希望k-1的下一个结点指向k,则k.next.next=k:

1 -> 2 -> 3-> ... ->k-1 -> k <- k+1 <- ... <- n

需要注意的是,结点1的下一个结点是None,需要特殊处理,在之前操作的基础上设置k的下一个结点为None:

n -> n-1 -> ... -> k+1 \

-> k -> None

1-> 2-> 3 -> ... ->k-1 /

class Solution(object): # 迭代

def reverseList(self, head):

"""

:type head: ListNode

:rtype: ListNode

"""

if not head or not head.next: # 如果输入结点是空,或只有一个结点,返回即可

return head

p = self.reverseList(head.next) # 将下一个结点之后的部分逆序

head.next.next = head # 反转当前结点

head.next = None # 设置当前结点的下一个结点为None

return p

这里,特地为大家做了一个脚本,近距离展示一下递归是如何工作的:

def create_linked_list(nums):

"""

创建链表

:param nums: 输入代表里链表的数字列表

:return: 返回创建好的链表的头结点,可以得到整个链表的所有信息

"""

if not nums: # 输入空列表

return

head = prev = ListNode(nums[0]) # 第一个结点

for num in nums[1:]:

tmp = ListNode(num) # 创建当前结点

prev.next = tmp # 挂在已经创建好的链表末尾

prev = prev.next # 指针后移

return head

def print_linked_list(head):

"""

打印链表

:param head: 要打印的链表的头结点

:return: 结点值列表

"""

nums = []

while head:

nums.append(head.val)

head = head.next

print(nums)

return nums

class ListNode(object):

def __init__(self, x):

self.val = x

self.next = None

class Solution(object):

def reverseList(self, head):

"""

:type head: ListNode

:rtype: ListNode

"""

if not head or not head.next: # 如果输入结点是空,或只有一个结点,返回即可

return head

p = self.reverseList(head.next) # 将下一个结点之后的部分逆序

head.next.next = head # 反转当前结点

head.next = None # 设置当前结点的下一个结点为None

print_linked_list(p) # 展示一下处理过程,如果不需要的话可以注释掉

return p

if __name__ == "__main__":

head = create_linked_list([1, 2, 3, 4, 5, 6, 7, 8, 9])

s = Solution()

reversed_head = s.reverseList(head)

该脚本的输出为:

[9, 8]

[9, 8, 7]

[9, 8, 7, 6]

[9, 8, 7, 6, 5]

[9, 8, 7, 6, 5, 4]

[9, 8, 7, 6, 5, 4, 3]

[9, 8, 7, 6, 5, 4, 3, 2]

[9, 8, 7, 6, 5, 4, 3, 2, 1]

创建链表(create_linked_list)和打印链表(print_linked_list)函数源自【链表基础】。

如有疑问或建议,欢迎评论区留言~

python反转链表_206. 反转链表(Python)相关推荐

  1. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  2. python怎么反转单链表_单链表反转python实现代码示例

    单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class Li ...

  3. Lined List 链表总结 Reverse链表 - 反转(python) leetcode 206 92

    今天来总结下关于链表的反转操作 目录: - 206 Reverse Linked List - 92 Reverse Linked List II 解读:这道reverse操作,我们采用two poi ...

  4. python单链表实现具体例子_Python实现数据结构线性链表(单链表)算法示例

    本文实例讲述了Python实现数据结构线性链表(单链表)算法.分享给大家供大家参考,具体如下: 初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码. #!/usr/bin ...

  5. python单链表类_python 链表类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一般我们都构造双向循环链表. 二 python单向链表实现1 单项链表实现app ...

  6. python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python

    一.描述 给你一个链表数组,每个链表都已经按升序排列.请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[ ...

  7. 全面分析再动手的习惯:链表的反转问题(递归和非递归方式)

    定义一个方法(函数),实现输入一个链表的头结点,然后可以反转这个链表的方向,并输出反转之后的链表的头结点. typedef struct Node{int data;Node *next; } Nod ...

  8. python之链表、单链表、双向链表、单向循环链表

    python之链表.单链表.双向链表.单向循环链表 链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时,又需要进行数据的搬迁,所以使用起来并非很灵活 链表结构可以充分利用计算机 ...

  9. python去实现链表_python实现链表

    链表: 链表不需要在内存存储一个连续的地方,通常就像一个链一样 它的每个节点包含本身和下一个元素的地址,以此来把两个元素进行关联,这就是一个链表 链表分单项和双向,一般单项就够用了. 链表存在的用意义 ...

最新文章

  1. ARP扫描工具arp-scan
  2. alphac测试和bata测试区别_电缆识别仪与电缆故障测试仪的区别
  3. 简单程序跟踪调试方式
  4. Nacos配置中心-多配置文件加载
  5. JAVASCRIPT 等比例缩放图片 限定最大宽度和最大高度
  6. Windows10安装Cmder(图文教程)
  7. Nginx的accept_mutex配置分析
  8. oracle数据库实例删除
  9. python海龟交易策略_python 海龟交易法则 股票回测-双均线规则(一)
  10. SQL中convert()函数基本使用
  11. 计算机音乐超级马丽,你与你的音乐梦想,只差一台数学计算器
  12. 如何在Linux下逛B站看视频
  13. 项目1在线交流平台-7.构建安全高效的企业服务-2.使用Security自定义社区网页认证与授权
  14. Ajax之【Ajax异步实现步骤】
  15. Qt-使用QString输出数字上标(不要再用x2或x^2表示平方啦)
  16. Django 之ORM(一)
  17. kernel启动优化
  18. 获取管理员权限的相关命令
  19. 带赖子的麻将胡牌算法Java_有人讨论下麻将胡牌,出牌算法吗,求思路
  20. iOS7.X越狱工具evasi0n7存重大bug 切勿急于越狱

热门文章

  1. 群英论道聚北京,共话PostgreSQL
  2. 缓存世界中的三大问题及解决方案
  3. 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”
  4. 没有它你的DevOps是玩不转的,你信不?
  5. 【华为云技术分享】华为云ServiceStage-企业级微服务开发框架利器
  6. 【华为云技术分享】ARMv8-A存储模型概述(1)
  7. 一条数据的HBase之旅,简明HBase入门教程1:开篇
  8. 基于React-Native0.55.4的语音识别项目全栈方案
  9. MATLAB矩阵的分解与变换
  10. sizeof 在C语言的作用,union 与sizeof的作用??