数据结构与算法 —— 链表linked list(05)
反转一个单链表。
进阶:
链表可以迭代或递归地反转。你能否两个都实现一遍?
示例 :
给定这个链表: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. 递归版本
递归:递归,就是在运行的过程中调用自己。
# 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)相关推荐
- 数据结构与算法 —— 链表linked list(01)
链表(维基百科) 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储, ...
- JavaScript数据结构与算法——链表详解(下)
在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...
- JavaScript数据结构与算法——链表详解(上)
注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...
- 数据结构与算法--链表实现以及应用
数据结构与算法–链表实现以及应用 链表是面试时候使用最频繁的一种数据结构.链表的结构简单,他由指针将若干个节点链接成链状结构.链表的创建,插入,删除,查询操作都只有几行代码可以完成,代码量比较少,可以 ...
- 数据结构与算法-链表学习笔记
数据结构与算法-链表学习笔记 链表的概念 链表是有序的列表. 链表是以节点的方式来存储,是链式存储,它在内存中并不是一定是连续的. 每个节点包含 data 域:存储数据, next 域:指向下一个节点 ...
- 数据结构与算法 -- 链表
一.链表介绍 1.链表有地址不连续的结点序列,必须通过指针相互连接. 2.链表的分类: (1)单向线性链表 每个节点中除了存储数据结构内容以外,还需要保存指向下一个节点的指针,叫做后指针.最后一个节点 ...
- Java数据结构与算法——链表
链表 模拟链表 单链表singleLinkedList 有序添加节点的方法 删除节点的方法 修改节点元素的方法 遍历链表节点的方法 元素反转的方法 元素的逆序打印 获取链表长度 测试链表 链表是一种常 ...
- 数据结构与算法-链表篇
链表与数组不同,是在物理空间中非连续的,依靠前一个节点记录下一个节点的地址进行连接的一种数据结构. 链表中每个节点存储的内容为当前节点和下个节点的指针. 链表一般分为三种 1.单向链表 2.双向链表 ...
- 数据结构和算法-链表
链表分类 单向链表 双向链表 优势: 删除某个节点更加高效, 可以快速找到前驱节点 可以方便的在某个节点前插入元素 循环链表 当要处理的数据具有环形结构的时候, 适合循环链表. 如约瑟夫环问题 双向循 ...
最新文章
- 计算机视觉训练模型效果不佳怎么破?
- 贾扬清、Alex Smola、Julia创始人等大咖齐聚,WAIC开发者日共话AI未来
- 腾讯云宣布核心产品全线降价,最高降幅达50%
- SQL Server 表变量和临时表的区别
- UIKit 框架之UIActionSheet
- 2018蓝桥杯省赛---java---A---1(分数)
- “智囊”机器人:让我为你解答工作中的任何问题!
- python计算两点间距离_python 计算方位角实例(根据两点的坐标计算)
- Oracle 查找并删除表中的重复记录
- github提交代码403
- 集成产品开发(IPD)初探
- Storyboard全解析-第二部分
- 房屋出租管理软件,打造一体化的管理模式
- h5的table表格边框线问题解决方案
- RT-Thread : IEEE1588/PTP 协议的实现
- 彻底弄懂typedef struct和struct定义结构体的区别
- 26 分解质因子 容斥 数学公式
- Pr动态图形模板Mogrt导入失败 Mogrt is Corrupt 解决方法 Motion Graphics Templates is corrupt.
- 导航栏调透明度HTML,导航栏透明度问题
- 【云周刊】第135期:云栖大会珍贵技术资料:20+覆盖容器技术、智能工业、大数据、开源数据库...
热门文章
- haddler处理队列 netty_Netty的任务队列的Task的三种使用场景
- 中科院计算机学院研究生招生名额,中科院研究生招生
- springboot+前端实现文件(图片)上传到指定目录
- %3c php $str1=,ThinkPHP5.0.215.1.* 代码执行和命令执行漏洞利用
- python没有requests模块_python没有名为“requests”的模块
- linux cp通同时新建目录_Linux 新手应该知道的 26 个命令
- android cocos2dx 3.15.1创建工程,Cocos2d-x创建android项目(cocos2d-x系列三)
- python创建列表副本_Python编程15:Python列表的排序和列表的副本
- c++ string 无法通过下标访问_数组下标1你见过吗?
- threejs 绘制球体_Three.js 第一篇:绘制一个静态的3D球体