题目 给你链表的头节点 head ,每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]
提示: 链表中的节点数目为 n 1 <= k <= n <= 5000 0 <= Node.val <= 1000
进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?
我的解答 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 public class ReverseNodesInKGroup { public ListNode reverseKGroup (ListNode head, int k) { if (head == null || head.next == null ){ return head; } Map<Integer,ListNode> indexMap = new HashMap <>(); ListNode itr = head; int index = 0 ; while (itr != null ){ indexMap.put(index++,itr); itr = itr.next; } int size = indexMap.size(); int batch = size/k; ListNode tail = indexMap.get((batch)*k); for (int i = 1 ; i <= batch; i++ ) { ListNode first = indexMap.get((i - 1 ) * k); if ( i + 1 > batch){ first.next = tail; }else { first.next = indexMap.get( (i + 1 )*k-1 ); } for (int n = k - 1 ; n > 0 ; n--) { ListNode curNode = indexMap.get((i - 1 ) * k + n ); ListNode preNode = indexMap.get((i - 1 ) * k + n - 1 ); curNode.next = preNode; } } return indexMap.get(k-1 ); } public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) {this .val = val;} ListNode(int val, ListNode next) { this .val = val; this .next = next; } @Override public String toString () { return String.valueOf(val); } } @Test public void test () { ListNode head = new ListNode (1 ,new ListNode (2 ,new ListNode (3 ,new ListNode (4 ,new ListNode (5 ))))); int k = 2 ; ListNode newList = reverseKGroup(head, k); ListNode tmp = newList; while (tmp != null ){ System.out.print(tmp + "->" ); tmp = tmp.next; } System.out.println(); head = new ListNode (1 ,new ListNode (2 ,new ListNode (3 ,new ListNode (4 ,new ListNode (5 ,new ListNode (6 )))))); k = 3 ; newList = reverseKGroup(head, k); tmp = newList; while (tmp != null ){ System.out.print(tmp + "->" ); tmp = tmp.next; } } }
参考答案 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 35 public ListNode reverseKGroup (ListNode head, int k) { if (head == null || head.next == null ) { return head; } ListNode tail = head; for (int i = 0 ; i < k; i++) { if (tail == null ) { return head; } tail = tail.next; } ListNode newHead = reverse(head, tail); head.next = reverseKGroup(tail, k); return newHead; } private ListNode reverse (ListNode head, ListNode tail) { ListNode pre = null ; ListNode next = null ; while (head != tail) { next = head.next; head.next = pre; pre = head; head = next; } return pre; }
链接:https://leetcode.cn/problems/reverse-nodes-in-k-group