25. Reverse Nodes in k-Group
Problem
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.
Solution
1、Python 递归 (36 ms, faster than 99.50%)
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
cur = head
count = 0
while cur and count != k:
cur = cur.next
count += 1
if count == k:
cur = self.reverseKGroup(cur, k)
while count > 0:
temp = head.next
head.next = cur
cur = head
head = temp
count -= 1
head = cur
return head
2、C 递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
struct ListNode* cur = head;
int count = 0;
while (cur && count != k) {
cur = cur->next;
count++;
}
if (count == k) {
cur = reverseKGroup(cur, k);
while (count > 0) {
struct ListNode* temp = head->next;
head->next = cur;
cur = head;
head = temp;
count -= 1;
}
head = cur;
}
return head;
}