反转一个单链表。

进阶:
链表可以迭代或递归地反转。你能否两个都实现一遍?

示例 :

给定这个链表:1->2->3->4->5

返回结果: 5->4->3->2->1

题目链接

解题思路:

1. 迭代版本:

循环列表,定义两个指针,一个指针是已经迭代完的链表的最后一个节点称为last_node,一个指针是已经迭代完的节点的第一个节点称为next_node。

刚开始的时候last_node 和next_node都指向链表head,循环last_node的next节点定义为cur,把last_node的next指向cur的next指针,把cur的next指向next_node节点。

next_node赋值为当前的cur节点。

最后返回next_node即可。

图如下

1   ->2    ->3   ->4   ->5

|

next_node

last_node

循环完1之后

2   ->1    ->3   ->4   ->5

|    |

|      last_node

next_node

代码如下:

# Definition for singly-linked list.
class ListNode(object):def __init__(self, x):self.val = xself.next = Noneclass Solution(object):def reverseList(self, head):""":type head: ListNode:rtype: ListNode"""if not head:return Nonelast_node = headnext_node = headwhile (last_node.next):cur = last_node.nextcur_next = cur.nextcur.next = next_nodelast_node.next = cur_nextnext_node = curreturn next_node

2. 递归版本

递归:递归,就是在运行的过程中调用自己。

构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理
先将从第一个点开始翻转转换成从下一个节点开始翻转 ,直至只剩一个节点 。
代码如下:
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def reverseList(self, head):""":type head: ListNode:rtype: ListNode"""if  head is None or head.next is None:return headpre_node = self.reverseList(head.next)head.next.next=headhead.next=Nonereturn pre_node

反转链表 II

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4

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

解题思路:

可以先找到翻转的开始位置,这里是2,然后根据这个位置将链表断开:1->null, 2->3->4->5->null,这就形成了两个链表。

然后,将第二个链表依次取头结点,放在1的后面:

1. 1->2->null, 3->4->5->null

2. 1->3->2->null, 4->5->null

。。。

这样的循环进行几次呢,循环3次,也就是n - m + 1次

之后再将现在的两个链表合并即可。代码就可以得到了

代码如下:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def reverseBetween(self, head, m, n):""":type head: ListNode:type m: int:type n: int:rtype: ListNode"""dummy = ListNode(-1)  dummy.next = head  pre = dummy  num = 1  # 找到要翻转部分的开始  while num != m:  pre = pre.next  num += 1  # gap为循环的次数  gap = n - m + 1  # 第二部分  next_part = pre.next  # 设置第一部分的尾节点,目的在于最后的合并  tail = next_part  pre.next = None  while gap != 0:  cur = next_part  next_part = next_part.next  temp = pre.next  pre.next = cur  cur.next = temp  gap -= 1  # 两部分合并  tail.next = next_part  return dummy.next

  

coding交流群:226704167,,郑州程序员群:59236263愿和各位一起进步!

微信公众号:

转载于:https://www.cnblogs.com/lip0121/p/8919035.html

数据结构与算法 —— 链表linked list(05)相关推荐

  1. 数据结构与算法 —— 链表linked list(01)

    链表(维基百科) 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储, ...

  2. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  3. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

  4. 数据结构与算法--链表实现以及应用

    数据结构与算法–链表实现以及应用 链表是面试时候使用最频繁的一种数据结构.链表的结构简单,他由指针将若干个节点链接成链状结构.链表的创建,插入,删除,查询操作都只有几行代码可以完成,代码量比较少,可以 ...

  5. 数据结构与算法-链表学习笔记

    数据结构与算法-链表学习笔记 链表的概念 链表是有序的列表. 链表是以节点的方式来存储,是链式存储,它在内存中并不是一定是连续的. 每个节点包含 data 域:存储数据, next 域:指向下一个节点 ...

  6. 数据结构与算法 -- 链表

    一.链表介绍 1.链表有地址不连续的结点序列,必须通过指针相互连接. 2.链表的分类: (1)单向线性链表 每个节点中除了存储数据结构内容以外,还需要保存指向下一个节点的指针,叫做后指针.最后一个节点 ...

  7. Java数据结构与算法——链表

    链表 模拟链表 单链表singleLinkedList 有序添加节点的方法 删除节点的方法 修改节点元素的方法 遍历链表节点的方法 元素反转的方法 元素的逆序打印 获取链表长度 测试链表 链表是一种常 ...

  8. 数据结构与算法-链表篇

    链表与数组不同,是在物理空间中非连续的,依靠前一个节点记录下一个节点的地址进行连接的一种数据结构. 链表中每个节点存储的内容为当前节点和下个节点的指针. 链表一般分为三种 1.单向链表 2.双向链表 ...

  9. 数据结构和算法-链表

    链表分类 单向链表 双向链表 优势: 删除某个节点更加高效, 可以快速找到前驱节点 可以方便的在某个节点前插入元素 循环链表 当要处理的数据具有环形结构的时候, 适合循环链表. 如约瑟夫环问题 双向循 ...

最新文章

  1. 计算机视觉训练模型效果不佳怎么破?
  2. 贾扬清、Alex Smola、Julia创始人等大咖齐聚,WAIC开发者日共话AI未来
  3. 腾讯云宣布核心产品全线降价,最高降幅达50%
  4. SQL Server 表变量和临时表的区别
  5. UIKit 框架之UIActionSheet
  6. 2018蓝桥杯省赛---java---A---1(分数)
  7. “智囊”机器人:让我为你解答工作中的任何问题!
  8. python计算两点间距离_python 计算方位角实例(根据两点的坐标计算)
  9. Oracle 查找并删除表中的重复记录
  10. github提交代码403
  11. 集成产品开发(IPD)初探
  12. Storyboard全解析-第二部分
  13. 房屋出租管理软件,打造一体化的管理模式
  14. h5的table表格边框线问题解决方案
  15. RT-Thread : IEEE1588/PTP 协议的实现
  16. 彻底弄懂typedef struct和struct定义结构体的区别
  17. 26 分解质因子 容斥 数学公式
  18. Pr动态图形模板Mogrt导入失败 Mogrt is Corrupt 解决方法 Motion Graphics Templates is corrupt.
  19. 导航栏调透明度HTML,导航栏透明度问题
  20. 【云周刊】第135期:云栖大会珍贵技术资料:20+覆盖容器技术、智能工业、大数据、开源数据库...

热门文章

  1. haddler处理队列 netty_Netty的任务队列的Task的三种使用场景
  2. 中科院计算机学院研究生招生名额,中科院研究生招生
  3. springboot+前端实现文件(图片)上传到指定目录
  4. %3c php $str1=,ThinkPHP5.0.215.1.* 代码执行和命令执行漏洞利用
  5. python没有requests模块_python没有名为“requests”的模块
  6. linux cp通同时新建目录_Linux 新手应该知道的 26 个命令
  7. android cocos2dx 3.15.1创建工程,Cocos2d-x创建android项目(cocos2d-x系列三)
  8. python创建列表副本_Python编程15:Python列表的排序和列表的副本
  9. c++ string 无法通过下标访问_数组下标1你见过吗?
  10. threejs 绘制球体_Three.js 第一篇:绘制一个静态的3D球体