25. K 个一组翻转链表
题目描述
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
输入输出
1 2 3 4 5
| 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]
输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5]
|
基本思路
实则不难 模拟切出k
个链表然后对每一段反转就行了
面试变体:最后不足k个也要反转
1 2 3 4 5
| ListNode node_remain = pre.next; pre.next = null; pre.next = reverse(node_remain); return dummyNode.next;
|
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode dummyNode = new ListNode(0); dummyNode.next = head;
ListNode pre = dummyNode; ListNode end = dummyNode; while(end != null) { for(int i = 0; i < k && end != null; i++){ end = end.next; } if(end == null) break; ListNode start = pre.next; ListNode next = end.next; end.next = null; pre.next = reverse(start); start.next = next; pre = start; end = pre; } return dummyNode.next; }
public ListNode reverse(ListNode head){ ListNode cur = head, pre = null; while(cur != null){ ListNode tmp = cur.next; cur.next = pre; pre = cur; cur = tmp; } return pre; } }
|