这道题看上去还是比较晦涩的,成功被带走了一个小时
本题的描述是给定一个链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
下面来看看官方的解法
class Solution:
# 翻转一个子链表,并且返回新的头与尾
def reverse(self, head: ListNode, tail: ListNode):
prev = tail.next
p = head
while prev != tail:
nex = p.next
p.next = prev
prev = p
p = nex
return tail, head
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
hair = ListNode(0)
hair.next = head
pre = hair
while head:
tail = pre
# 查看剩余部分长度是否大于等于 k
for i in range(k):
tail = tail.next
if not tail:
return hair.next
nex = tail.next
head, tail = self.reverse(head, tail)
# 把子链表重新接回原链表
pre.next = head
tail.next = nex
pre = tail
head = tail.next
return hair.next
解读一下代码
如果不懂其中的子链表翻转那一块可以 参考这个链表翻转,自己画个图
https://blog.csdn.net/weixin_43184615/article/details/84376790?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158993906119724848309252%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=158993906119724848309252&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2
all
first_rank_ecpm_v3~pc_rank_v2-4-84376790.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E9%93%BE%E8%A1%A8%E7%BF%BB%E8%BD%ACc%2B%2B
画图要按照链表的格式来画,松散法,不要放在一个表格里,那样会陷入固定思维
因为链表的存储形式就是松散存储,我用了两个小时理解了链表翻转那个函数,剩下的就是不够k的把它直接连到原来的链表就可以了
力扣原文链接
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/