【经典专题】反转链表——如何在链表中穿针引线
反转整个链表(简单)
很简单且经典的题目。就是将 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
【经典专题】反转链表——如何在链表中穿针引线相关推荐
- 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...
前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...
- python怎么反转单链表_单链表反转python实现代码示例
单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class Li ...
- 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)
一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...
- 循环控制-链表反转(与创建链表)
0.目录 1.循环控制 2.Java代码实现 2.1 创建链表和递归反转实现 2.2 循环反转思路 2.3 链表反转的实现 2.4 测试用例 2.5 循环控制-创建链表 1.循环控制 循环书写方法: ...
- 递归反转链表改变原链表吗_在不使用递归的情况下找到链表的长度
递归反转链表改变原链表吗 Solution: 解: Algorithm to find length 查找长度的算法 Input: 输入: A singly linked list whose add ...
- C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结
C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以 ...
- 【C++】链表反转逆序|建立、删除、修改、插入|linux内核链表与普通链表
目录 C++实现链表逆序 链表的建立.删除.修改.插入 linux内核链表与普通链表 C++实现链表逆序 实现链表逆序,首先要有一个链表,下面是链表的结构体: typedef struct listn ...
- 【区块反转】【链表合并】【反转链表】【链表元素分类】【链表去重】【重排链表】
目录 说明: 1110 区块反转 输入格式: 输出格式: 输入样例: 输出样例: 1105 链表合并 输入格式: 输出格式: 输入样例: 输出样例: 1025 反转链表 输入格式: 输出格式: 输入样 ...
- 反转链表、旋转链表算法总结
目录 反转链表(力扣:206) 反转链表 II(力扣:92) 旋转链表(力扣:61) 算法实现 1. 反转链表 题目 反转一个单链表. 思路 该题比较简单.这里涉及到3个节点:前一个节点.当前节点和后 ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...
题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...
最新文章
- Linux中pthread源码在哪,pthread - 源码下载|系统编程|Linux/Unix编程|源代码 - 源码中国...
- Java之品优购部署_day03(6)
- python画星空的程序_用python画星空源代码是什么?
- django博客项目7
- 网络链路不稳定的排查问题方法
- Docker、CentOS 8遭弃用,GPT-3、M1芯片撼动技术圈,盘点2020影响开发者的十大事件!
- NodeJs将项目上传至服务器
- android 多语言(在APP里面内切换语言)
- 42-2017蓝桥杯b java
- PySerial库的简单用法
- java-net-php-python-jspm网上订餐系统查重PPT计算机毕业设计程序
- FFmpeg 加水印 加马赛克
- ios10--拳皇动画
- C# 改变鼠标样式
- 交叉碳市场和 Web3 以实现再生变革
- c语言socket通讯和进行进行大文件分片传输
- Linux3._Linux环境基础开发工具使用
- 【Codeforces 869 C The Intriguing Obsession】 组合数学 思维
- [CS144] Lab 1: stitching substrings into a byte
- Constrained Joint CRF for Simultaneous FAUR and FLD