反转整个链表(简单)

很简单且经典的题目。就是将 1->2->3->4->5 反转为 5->4->3->2->1

有两种思路,迭代递归。先看图再看代码:

1)迭代——经典的双/三指针

class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}return pre;}
}

2)递归——假设子问题已经解决

class Solution {public ListNode reverseList(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}
}

反转整个链表(进阶)

这里提供另一种思路,即一种不断“提到前面”的方法:

1)遍历到哪个节点,就将哪个节点提前到第一个;

2)这个过程需要借助dummy虚节点;

3)移动的双指针为cur和nxt(每次取cur的下一个为nxt;由于nxt不断提前,cur不断自动后移)

dummy -> 1 -> 2 -> 3 -> 4 -> 5        提前2
dummy -> 2 -> 1 -> 3 -> 4 -> 5       提前3
dummy -> 3 -> 2 -> 1 -> 4 -> 5       提前4
dummy -> 4 -> 3 -> 2 -> 1 -> 5       提前5
dummy -> 5 -> 4 -> 3 -> 2 -> 1       大功告成!
class Solution {public ListNode reverseList3(ListNode head) {if (head == null) {return null;}ListNode dummy = new ListNode(-1, head);ListNode pre = dummy;ListNode cur = head;ListNode nxt = null;while (cur.next != null) {nxt = cur.next;cur.next = nxt.next;nxt.next = pre.next;pre.next = nxt;}return dummy.next;}
}

反转部分链表(难点)

学会了迭代和递归就够了,为什么还要学习第三种“提前”法?正是为此题做准备:

如果使用迭代/递归,算法和实现和边界的处理都非常麻烦:

1)遍历一次,找到left和right的位置及其哨兵的位置;

2)截取链表,用迭代/递归进行反转,同时还要有头/尾的指针;

3)拼接回去;

而如果使用第三种方法,也就一次遍历的事儿:

1)for(left)找到pre的位置并固定;

2)for(right-left)对要反转的部分节点不断进行提前的操作;

3)结束;

class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {ListNode dummy = new ListNode(-1);dummy.next = head;ListNode pre = dummy;ListNode cur = null;ListNode nxt = null;for (int i = 0; i < left - 1; i++) {pre = pre.next;}cur = pre.next;for (int i = 0; i < right - left; i++) {// 这段取“nxt然后提前”的代码,像是在链表上穿针引线 >_<nxt = cur.next;cur.next = nxt.next;nxt.next = pre.next;pre.next = nxt;}return dummy.next;}
}

ENDENDEND

【经典专题】反转链表——如何在链表中穿针引线相关推荐

  1. 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...

    前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...

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

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

  3. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

  4. 循环控制-链表反转(与创建链表)

    0.目录 1.循环控制 2.Java代码实现 2.1 创建链表和递归反转实现 2.2 循环反转思路 2.3 链表反转的实现 2.4 测试用例 2.5 循环控制-创建链表 1.循环控制 循环书写方法: ...

  5. 递归反转链表改变原链表吗_在不使用递归的情况下找到链表的长度

    递归反转链表改变原链表吗 Solution: 解: Algorithm to find length 查找长度的算法 Input: 输入: A singly linked list whose add ...

  6. C++ 单链表基本操作分析与实现 链表   链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结

    C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以 ...

  7. 【C++】链表反转逆序|建立、删除、修改、插入|linux内核链表与普通链表

    目录 C++实现链表逆序 链表的建立.删除.修改.插入 linux内核链表与普通链表 C++实现链表逆序 实现链表逆序,首先要有一个链表,下面是链表的结构体: typedef struct listn ...

  8. 【区块反转】【链表合并】【反转链表】【链表元素分类】【链表去重】【重排链表】

    目录 说明: 1110 区块反转 输入格式: 输出格式: 输入样例: 输出样例: 1105 链表合并 输入格式: 输出格式: 输入样例: 输出样例: 1025 反转链表 输入格式: 输出格式: 输入样 ...

  9. 反转链表、旋转链表算法总结

    目录 反转链表(力扣:206) 反转链表 II(力扣:92) 旋转链表(力扣:61) 算法实现 1. 反转链表 题目 反转一个单链表. 思路 该题比较简单.这里涉及到3个节点:前一个节点.当前节点和后 ...

  10. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...

最新文章

  1. Linux中pthread源码在哪,pthread - 源码下载|系统编程|Linux/Unix编程|源代码 - 源码中国...
  2. Java之品优购部署_day03(6)
  3. python画星空的程序_用python画星空源代码是什么?
  4. django博客项目7
  5. 网络链路不稳定的排查问题方法
  6. Docker、CentOS 8遭弃用,GPT-3、M1芯片撼动技术圈,盘点2020影响开发者的十大事件!
  7. NodeJs将项目上传至服务器
  8. android 多语言(在APP里面内切换语言)
  9. 42-2017蓝桥杯b java
  10. PySerial库的简单用法
  11. java-net-php-python-jspm网上订餐系统查重PPT计算机毕业设计程序
  12. FFmpeg 加水印 加马赛克
  13. ios10--拳皇动画
  14. C# 改变鼠标样式
  15. 交叉碳市场和 Web3 以实现再生变革
  16. c语言socket通讯和进行进行大文件分片传输
  17. Linux3._Linux环境基础开发工具使用
  18. 【Codeforces 869 C The Intriguing Obsession】 组合数学 思维
  19. [CS144] Lab 1: stitching substrings into a byte
  20. Constrained Joint CRF for Simultaneous FAUR and FLD

热门文章

  1. 情人节氛围感,咱就是说,必须一整个拿捏住
  2. 14.网络通信基础知识
  3. 互联网竞争,本质是渠道之争
  4. C语言——实例033 gotoxy()与clrscr()函数
  5. 如何将手机网页转为微信小程序【干货】
  6. 淋巴细胞分离液使用说明书
  7. 雷蛇鼠标垫的真伪鉴别
  8. 计算机组成原理复习,为了练习打字速度,以及为了晚上加深记忆计组的一些知识
  9. 信息系统项目管理师-知识点总结
  10. 回忆那些楼市成交的黄金岁月(全)