给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。node
k 是一个正整数,它的值小于或等于链表的长度。若是节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。git
示例:github
给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5
说明:golang
1. 取链表的前K个节点,若是够K个节点,就截断后进行反转,不够K个节点,说明处理完了,return 2. 反转完前K个节点后,使用递归,处理后面的链表
// ListNode Definition for singly-linked list. type ListNode struct { Val int Next *ListNode } func reverseKGroup(head *ListNode, k int) *ListNode { if k < 2 || head == nil || head.Next == nil { return head } tail, needReverse := getTail(head, k) if needReverse { tailNext := tail.Next //斩断 tail 后的连接 tail.Next = nil head, tail = reverse(head, tail) //tail 后面接上尾部的递归处理 tail.Next = reverseKGroup(tailNext, k) } return head } func getTail(head *ListNode, k int) (*ListNode, bool) { for k > 1 && head != nil { head = head.Next k-- } return head, k == 1 && head != nil } func reverse(head, tail *ListNode) (*ListNode, *ListNode) { //反转链表 prev, cur := head, head.Next for cur != nil { prev, cur, cur.Next = cur, cur.Next, prev } return tail, head }