LeetCode | 25. Reverse Nodes in k-Group
题目描述
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Note:
Only constant extra memory is allowed.
You may not alter the values in the list’s nodes, only nodes itself may be changed.
思路
本题要求将给定的链表每k个反转,不足k个的不反转。
根据反转链表的解法,我们需要知道反转的新链表头,例:1->2->3->4->5 ,k=2
- 将链表向前遍历k次,找到第一次反转的头:1->2->3(fast)->4->5
- 反转前k个值,2->1->3(fast)->4->5
- 递归的反转fast指向的节点,2->1->4->3->5(fast)
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null || head.next == null) return head;
ListNode fast = head;
for(int i=0; i<k; i++) {
if(fast==null) return head;
fast = fast.next;
}
ListNode newHead = reverse(head, fast);
head.next = reverseKGroup(fast,k);
return newHead;
}
public ListNode reverse(ListNode head, ListNode tail) {
ListNode res = tail;
while(head!=tail) {
ListNode tmp = head.next;
head.next = res;
res = head;
head = tmp;
}
return res;
}
}
Beats 100%