题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-groupnode
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。python
k 是一个正整数,它的值小于或等于链表的长度。算法
若是节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。spa
示例:指针
给你这个链表:1->2->3->4->5code
当 k = 2 时,应当返回: 2->1->4->3->5blog
当 k = 3 时,应当返回: 3->2->1->4->5leetcode
说明:get
思路:迭代、翻转链表it
具体思路:
具体的代码实现以下。
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseKGroup(self, head: ListNode, k: int) -> ListNode: if head == None and head.next == None and k < 2: return head # 定义哨兵节点 dummy = ListNode(0) # 指向节点 dummy.next = head # 定义前驱后继节点 pre = dummy tail = dummy # 控制 tail 到待翻转链表部分的末尾 while True: count = k while count > 0 and tail != None: count -= 1 tail = tail.next # 到达尾部时,长度不足 k 时,跳出循环 if tail == None: break # 这里用于下次循环 head = pre.next # 开始进行翻转 while pre.next != tail: tmp = pre.next pre.next = tmp.next tmp.next = tail.next tail.next = tmp # 重置指针 pre = head tail = head return dummy.next
以上就是使用迭代,根据题目提供的 k 值肯定翻转链表部分,在内部实现翻转,进而解决《25. K 个一组翻转链表》的主要内容。其中注意要定义链表的前驱和后继,防止指向错误。