递归法

反转链表1

class Solution(object):def reverseList(self, head):""":type head: ListNode:rtype: ListNode"""# 递归终止条件是当前为空,或者下一个节点为空if(head==None or head.next==None):return head# 这里的cur就是最后一个节点cur = self.reverseList(head.next)# 这里请配合动画演示理解# 如果链表是 1->2->3->4->5,那么此时的cur就是5# 而head是4,head的下一个是5,下下一个是空# 所以head.next.next 就是5->4head.next.next = head# 防止链表循环,需要将head.next设置为空head.next = None# 每层递归函数都返回cur,也就是最后一个节点return cur

迭代(双指针)

反转链表1

class Solution(object):def reverseList(self, head):""":type head: ListNode:rtype: ListNode"""# 申请两个节点,pre和 cur,pre指向Nonepre = Nonecur = head# 遍历链表,while循环里面的内容其实可以写成一行# 这里只做演示,就不搞那么骚气的写法了while cur:# 记录当前节点的下一个节点tmp = cur.next# 然后将当前节点指向precur.next = pre# pre和cur节点都前进一位pre = curcur = tmpreturn pre    

穿针引线(头插法)

反转链表2
下面我们具体解释如何实现。使用三个指针变量 pre、curr、next 来记录反转的过程中需要的变量,它们的意义如下:

curr:指向待反转区域的第一个节点 left;
next:永远指向 curr 的下一个节点,循环过程中,curr 变化以后 next 会变化;
pre:永远指向待反转区域的第一个节点 left 的前一个节点,在循环过程中不变。


操作步骤:

  1. 先将 curr 的下一个节点记录为 next;
  2. 执行操作 ①:把 curr 的下一个节点指向 next 的下一个节点;
  3. 执行操作 ②:把next 的下一个节点指向 pre 的下一个节点;
  4. 执行操作 ③:把 pre 的下一个节点指向 next。
class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:# 设置 dummyNode 是这一类问题的一般做法dummy_node = ListNode(-1)dummy_node.next = headpre = dummy_nodefor _ in range(left - 1):pre = pre.nextcur = pre.nextfor _ in range(right - left):next = cur.nextcur.next = next.nextnext.next = pre.nextpre.next = nextreturn dummy_node.next

Python3--反转链表之迭代,递归,穿针引线(头插法)相关推荐

  1. 【LeetCode】【HOT】206. 反转链表(迭代/递归)

    [LeetCode][HOT]206. 反转链表 文章目录 [LeetCode][HOT]206. 反转链表 package hot;import java.util.Arrays;class Lis ...

  2. 翻转链表II[翻转链表3种方式+dummyHead/头插法/尾插法]

    翻转链表 前言 一.翻转链表中间部分 二.dummyHead&头插法&尾插法 1.一次扫描 + 翻转链表(另一次扫描) 2.一次扫描&头插法&尾插法(进阶) 总结 参考 ...

  3. [剑指offer][JAVA]面试题第[24]题[反转链表][递归][双指针][头插法]

    [问题描述][中等] 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.示例:输入: 1->2->3->4->5->NULL 输出: 5->4 ...

  4. 005 反转单链表(迭代递归)

    输入一个链表,反转链表后,输出新链表的表头. 1.迭代法 迭代法的关键在于用pNext记录当前节点pNode的下一节点的值,否则它在迭代过程时会被丢失. 2.递归法 类似于栈的概念,先递归到最后的节点 ...

  5. 剑指Offer - 面试题24. 反转链表(遍历/递归)

    1. 题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4-&g ...

  6. 反转链表问题的递归解法

    目录 一.反转整个链表 二.反转部分链表 一.反转整个链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 首先在方法中我们需要判断递归终止的情况,如果head==null或者he ...

  7. 数据结构专题(二):2.4链表的插入操作,头插法

    头插法一: 思想如下图: 如下代码: ///头插法建立单链表 LinkListNode *Create_Front_Lklist(ElemType arr[],int length) {LinkLis ...

  8. 单链表的基础操作(头插法、尾插法、插入和删除)

    一.链表的建立(头插法和尾插法) 1.头插法:把后建立的结点插在头部.用这种方法建立起来的链表的实际顺序与输入顺序刚好向反,输出时为倒序! 下面附上代码: struct node *headcreat ...

  9. leetcode206题:反转链表(迭代或是递归)

    题目描述: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思 ...

最新文章

  1. 互联网人必读的30本书
  2. JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
  3. vscode 调试html页面,vscode调试HTML
  4. 大学士带你领略“大院大所”黑科技!
  5. CTFshow 信息收集 web15
  6. Java基础--static静态原理及API使用示例详解
  7. java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
  8. LESS CSS 框架简介(转)
  9. oracle11g导入错误,oracle 11g导入到10g引起的错误
  10. 涡轮流量计说明书_实际应用中超声波流量计与电磁流量计哪个更好用
  11. web-attack 1-5视频汇总
  12. PHP 单元测试问题记录
  13. hwclock设置日期_hwclock显示系统硬件时钟的日期和时间
  14. 计算机歌曲带歌词,mp3上怎么看歌词?我的机子说是可以显示的啊
  15. 【Python_010】利用python对excel进行去重
  16. 【小白篇】初探 Processing 色彩
  17. h2o api java_H2O框架简介
  18. 1-(2-甲氧基乙基)-3-乙基咪唑三氟甲基磺酸盐{[C22O1IM][TfO]}离子液体
  19. cos三次方积分_COS分之一三次方积分
  20. 22.实战:Kaggle房价预测

热门文章

  1. ZephyrOS--浅谈Bluetooth LE
  2. ASP.NET 2.0 – 为什么替GridView的BoundField设定的DataFormatString没有效?
  3. CCF:201812-1 小明上学 (C语言)
  4. 第二十六讲:神州路由器PPP PAP认证的配置
  5. 2020年中国家庭育儿市场发展
  6. vue埋点 记录在前端页面停留时间
  7. vb.net 导出为excel及邮件群发
  8. 详解 JavaScript 中的异步与线程
  9. 恭喜!密码学家王小云获未来科学大奖,百万美元奖金
  10. 给程序猿的一节男士基础护肤课