一、 问题描述
Leecode第二十五题,题目为:
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是一个正整数,小于或等于链表的长度。如果节点的数量不是k的倍数,那么最后遗漏的节点应该保持原样。
例:
给定链表:1->2->3->4->5
如果k = 2,应该返回:2->1->4->3->5
如果k = 3,应该返回:3->2->1->4->5
注:
只允许定量的额外内存。
不允许更改列表节点中的值,只能更改节点本身。
二、算法思路
1、
2、
三、实现代码
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* p = Node(head, k);
if(head == NULL || p == NULL)
return head;
ListNode* res = reverseKGroup(p->next, k);
p->next = NULL;
while(head)
{
ListNode* node = head->next;
head->next = res;
res = head;
head = node;
}
return res;
}
ListNode* Node(ListNode* head, int k)
{
for(int j = 0; head && j < k - 1; j++)
{
head = head->next;
}
return head;
}
};