题目
给你链表的头节点
head
,每k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k
的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
解题思路
- 先排除特殊情况,k==1即不用翻转,节点为null则当前函数内也不需要翻转;
- 统计是否有k个数据来判断是否需要翻转;
- 通过while循环对k个节点进行翻转,尾节点传入下一次递归当中;
- 返回首节点,并赋值给上一个尾节点的next。
代码展示
class Solution { public ListNode reverseKGroup(ListNode head, int k) { if(k == 1){ return head; } if(head == null){ return null; } int index = 1; ListNode end = head.next; //判断是否需要继续翻转 boolean status = false; while (end != null){ index++; if(index == k){ status = true; break; } //递归需要传递的数据 end = end.next; } if(status){ ListNode before = end.next; ListNode now = head; index = 0; while (index < k){ ListNode temp = now.next; now.next = before; before = now; now = temp; index++; } head.next = reverseKGroup(head.next, k); } else { return head; } return end; } }