type
status
date
slug
summary
tags
category
icon
password
Life is a wilderness, not a track.
📝 今日leetcode
25.K个一组翻转链表
给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

头脑风暴
- K个节点的链表翻转怎么实现?
① 迭代: 要存储三个节点,pre、cur、next。cur.next = pre, pre = cur, cur = next, next = next.next;
② 递归: def reversal(ListNode head), 假设前面的节点已经翻转
such as: 原:n0→n1→n2→…→nm→nm+1→…→n
- 实现K歌一组翻转
① 主函数中判断idx:i:i+k if i+k < n 问题是链表和列表也不一样,不能用idx。需要用一个指针去实现翻转部分结尾的指示
② 调用1中翻转函数,实现该组的翻转
③ 利用循环实现
Q:前面一组翻转后,会与后面的节点断开,要用一个指针保存
子链和子链之间的链接
最终返回的头节点的讨论
需要指针: 子链表头节点head, 翻转之后,回到原链表时的前一个节点(原链表的tail.next)

回归原链表

回归后更新head和tail为下一子链表的头节点和尾节点
Solution
进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?
见solution
🤗 总结归纳

没有涉及复杂的算法理论,但是细节很多,需要考虑得很周全,一开始很难弄明白它循环啊、指针啊各种更新的条件。
- Author:NotionNext
- URL:https://tangly1024.com/article/eebf966c-831c-410e-9501-2730947ae8ea
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!