NC50 链表中的节点每k个一组翻转
Posted 抚琴尘世客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NC50 链表中的节点每k个一组翻转相关的知识,希望对你有一定的参考价值。
1. 题目
将给出的链表中的节点每\\ k k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是\\ k k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 \\ O(1) O(1)
如果链表中的节点数不是\\ k k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 \\ O(1) O(1)
例如:
给定的链表是1\\to2\\to3\\to4\\to51→2→3→4→5
对于 \\ k = 2 k=2, 你应该返回 2\\to 1\\to 4\\to 3\\to 52→1→4→3→5
对于 \\ k = 3 k=3, 你应该返回 3\\to2 \\to1 \\to 4\\to 53→2→1→4→5
2. 示例
输入:{1,2,3,4,5},2
返回值:{2,1,4,3,5}
3. 题解
放图(此图转自牛客大佬,谢谢带来的帮助,(#^.^#))
此题是链表里的一个绝对经典的题,对所有人都有很大的帮助,所以写下来了。
本题最关键的是如何不引入额外空间的情况,实现翻转。
其根本考察的是对链表的插入和删除。
本题将其定位到一个局部进行操作,有三个关键的字段:pre, cur, temp。
pre是每一小段的头结点,负责衔接;
cur用来行走链表,其实相当于已遍历过的尾结点,其下面一个就是即将插入头部的节点。
temp用来存储需要删除的以及即将插入头部的节点。
4. Code实现
1 class Solution:
2 def reverseKGroup(self, head, k):
3 if not head or k <= 1:
4 return head
5 root, n = head, 0
6 # 统计节点个数
7 while root:
8 n += 1
9 root = n
10 res = ListNode(0)
11 res.next = head
12 pre, cur, temp = res, head, None
13 # 分段使用头插法将链表反序
14 for i in range(0, n // k):
15 # pre作为每一小段的头结点,负责衔接
16 for j in range(1, k):
17 temp = cur.next
18 cur.next = temp.next
19 temp.next = pre.next
20 pre.next = temp
21 # 每个子序列反序完成后,pre,cur需要重新更新到下一子序列的头部
22 pre = cur
23 cur = cur.next
24 return res.next
5. 结语
努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!
如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。
但行好事 莫问前程
以上是关于NC50 链表中的节点每k个一组翻转的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点# 面试必刷TOP101:链表中的节点每k个一组翻转