21.03.12 LeetCode25. K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
示例 3:
输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]
示例 4:
输入:head = [1], k = 1
输出:[1]
class Solution { public ListNode reverseKGroup(ListNode head, int k) { if(k==1) return head; ListNode dst = new ListNode(-1,head); ListNode pre = dst; ListNode end = dst; while(end.next!=null) { //让end指针走到pre后的第k个节点 for(int i = 0;i<k && end!=null;i++) end = end.next; //如果end走到null证明pre后面的节点不足k个,不做任何操作,直接返回 if(end==null) break; //如果不为null ListNode next = end.next; ListNode start = pre.next;//头 end.next = null; pre.next = reverse(start);//反转链表,然后接上pre start.next = next;//接上next //pre跳转到start位置。 pre = start; end = pre;//重置end位置 } return dst.next; } public ListNode reverse(ListNode node) { ListNode pre = null; ListNode next = null; ListNode cur = node; while(cur!=null) { next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; } }