算法篇:链表之反转链表
时间:2022-07-22
本文章向大家介绍算法篇:链表之反转链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法:
反转链表的基本操作可以拆分成下面四步:
1.保存前序节点,
2.保存后续节点,
3.当前节点指向前序节点
4.偏移前序节点和当前节点
其他的变形题目,主要围绕两个关键点:
1.反转之后的前序节点的处理
2.反转之后的后续节点的保存
题目1:反转链表
https://leetcode-cn.com/problems/reverse-linked-list/
代码实现:
/*
解法:保存前序节点,
保存后续节点,
当前节点指向前序节点
偏移前序节点和当前节点
返回值 是前序节点
*/
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
var pre *ListNode
curr := head
for curr != nil {
// fmt.Println(":",*curr)
tmp := curr.Next
curr.Next = pre
pre = curr
curr = tmp
}
return pre
}
执行结果:
题目2:
https://leetcode-cn.com/problems/reverse-linked-list-ii/
代码实现:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseBetween(head *ListNode, m int, n int) *ListNode {
if head == nil || head.Next == nil || m == n{
return head
}
first := head
var begin *ListNode
for i:= m; i>1; i-- { // 找到m节点的前序节点
begin = first
first = first.Next
}
var h1 *ListNode = first
for i:=n;i>m;i-- { // 找到第n个节点
h1 = h1.Next
}
var second *ListNode
if h1.Next != nil { // 找到第n个节点的后续节点
second = h1.Next
}
h1.Next = nil // 从n节点位置将链表分成两个单独的链表
// first为反转后的前序节点,second为反转之后的后续节点,
// 对于要反转的链表来说,second也是头节点的前序节点
h1 = reverseList(first,second)
if begin != nil {
begin.Next = h1
} else {
head = h1
}
return head
}
func reverseList(head *ListNode, last *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
curr := head
var pre *ListNode = last
for curr != nil {
tmp := curr.Next
curr.Next = pre
pre = curr
curr= tmp
}
return pre
}
/*
解法:将需要反转的单独拉出一个列表来操作
然后,将前面的初始位置记录一下
将结尾位置作为反转之后的pre节点连接起来
备注:需要注意传入的起始和结束位置为整个链表的情况
*/
执行结果:
题目3:两两交换链表中的节点 https://leetcode-cn.com/problems/swap-nodes-in-pairs/submissions/
代码实现:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
// 解法:递归,1st和2nd节点反转,1st节点的next指向反转之后的链表,2nd.Next指向1st作反转处理
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
// 两个临时节点定好位置
first := head
second:= head.Next
// 反转处理
first.Next = swapPairs(second.Next)
second.Next = first
return second
}
执行结果:
题目4:k个一组反转链表
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
代码实现:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
// 解法:递归,K个节点反转一次,然后头节点转换指向到下一个k链表,
// 循环直到都操作结束
func reverseKGroup(head *ListNode, k int) *ListNode {
if head == nil {
return head
}
begin,end := head,head
for i:=0; i<k;i++{
if end == nil { // 小于k的链表,直接返回
return head
}
end = end.Next
}
// end表示的是反转之后的头节点,其实就是k链表之后的那个节点
node := reverseList(begin,end)
// 更换头节点的指向,方便下一次反转链表
begin.Next = reverseKGroup(end,k)
return node
}
// 一个链表的反转,node表示反转之后的头节点
func reverseList(head *ListNode, node *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
curr:= head
pre := node
for curr != node {
tmp := curr.Next
curr.Next=pre
pre = curr
curr= tmp
}
return pre
}
执行结果:
- PHP 排序算法实现讲解
- PHP7新特性介绍
- VFS四大对象之四-struct file
- 《Redis设计与实现》读书笔记(二) ——Redis中的字典(Hash)
- 《Redis设计与实现》读书笔记(三) ——Redis中的链表
- 《Redis设计与实现》读书笔记(四) ——Redis中的跳跃表
- 解析Linux中的VFS文件系统之文件系统的注册(二)
- vivi虚拟摄像头驱动程序
- 系统架构 | 基于微服务架构,改造企业核心系统之实践
- 《Redis设计与实现》读书笔记(五) ——Redis中的整数集合
- 《Redis设计与实现》读书笔记(七) ——Redis对象综述及字符串对象实现原理
- 自动登录脚本
- 极致之处,精彩无限 - 优化了一半的SQL
- 编程修炼 | Scala中Stream的应用场景及其实现原理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Tensorflow滑动平均模型
- lnmp应用服务器安装手册
- Tensorflow简单CNN实现详解
- 应用服务器安装手册
- python 读取文件函数
- Tkinter Menubar
- python pickle模块
- 吴恩达机器学习笔记18-逆矩阵、矩阵转置
- Tkinter messagebox弹窗
- 'utf-8' codec can't decode byte 0xff in position 0
- iOS今日头条第3轮面试回忆
- Python:os.path.join()产生的斜杠在Windows和Linux下的不同表现和解决方法
- python 深复制和浅复制详解
- Octave入门之数据操作—ML Note28
- matlab导出csv文件多种方法实现