题目描述
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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
#include <iostream>
#include <vector>
using namespace std;
/// Linear Scan and Recursive Reverse
/// Time Complexity: O(n)
/// Space Complexity: O(k)
/// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* dummyHead = new ListNode(-1);
dummyHead->next = head;
ListNode* pre = dummyHead;
while(pre && pre->next){
ListNode* end = pre;
int i;
for(i = 0; i < k && end->next; i ++)
end = end->next;
if(i != k) break;
ListNode* next = end->next;
// reverse from pre->next to end
ListNode* rhead = reverse(pre->next, end);
ListNode* tail = pre->next;
pre->next = rhead;
tail->next = next;
pre = tail;
}
ListNode* ret = dummyHead->next;
delete dummyHead;
return ret;
}
private:
ListNode* reverse(ListNode* head, ListNode* end){
if(head == end) return head;
ListNode* rhead = reverse(head->next, end);
head->next->next = head;
return rhead;
}
};
/// LinkedList 测试辅助函数
// 根据n个元素的数组arr创建一个链表, 并返回链表的头
ListNode* createLinkedList(const vector<int>& arr){
if(arr.size() == 0)
return NULL;
ListNode* head = new ListNode(arr[0]);
ListNode* curNode = head;
for(int i = 1 ; i < arr.size() ; i ++){
curNode->next = new ListNode(arr[i]);
curNode = curNode->next;
}
return head;
}
// 打印以head为头结点的链表信息内容
void printLinkedList(ListNode* head){
ListNode* curNode = head;
while(curNode != NULL){
cout << curNode->val << " -> ";
curNode = curNode->next;
}
cout << "NULL" << endl;
return;
}
// 释放以head为头结点的链表空间
void deleteLinkedList(ListNode* head){
ListNode* curNode = head;
while(curNode != NULL){
ListNode* delNode = curNode;
curNode = curNode->next;
delete delNode;
}
return;
}
int main() {
vector<int> arr1 = {1, 2, 3, 4, 5};
ListNode* res1 = Solution().reverseKGroup(createLinkedList(arr1), 3);
printLinkedList(res1);
deleteLinkedList(res1);
return 0;
}
思路二
#include <iostream>
#include <vector>
using namespace std;
/// Linear Scan and Recursive Reverse
/// Time Complexity: O(n)
/// Space Complexity: O(k)
/// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* dummyHead = new ListNode(-1);
dummyHead->next = head;
ListNode* cur = dummyHead;
while(cur && cur->next){
ListNode* tail = cur->next;
ListNode* left;
bool ok = false;
cur->next = reverse(cur->next, k - 1, left, ok);
tail->next = left;
if(ok)
cur = tail;
else {
tail = cur->next;
cur->next = reverse(cur->next, k - 1, left, ok);
tail->next = NULL;
break;
}
}
ListNode* ret = dummyHead->next;
delete dummyHead;
return ret;
}
private:
ListNode* reverse(ListNode* head, int index, ListNode* &left, bool& ok){
if(index == 0 || !head->next){
ok = index == 0;
left = head->next;
return head;
}
ListNode* tail = head->next;
ListNode* ret = reverse(head->next, index - 1, left, ok);
tail->next = head;
return ret;
}
};
/// LinkedList 测试辅助函数
// 根据n个元素的数组arr创建一个链表, 并返回链表的头
ListNode* createLinkedList(const vector<int>& arr){
if(arr.size() == 0)
return NULL;
ListNode* head = new ListNode(arr[0]);
ListNode* curNode = head;
for(int i = 1 ; i < arr.size() ; i ++){
curNode->next = new ListNode(arr[i]);
curNode = curNode->next;
}
return head;
}
// 打印以head为头结点的链表信息内容
void printLinkedList(ListNode* head){
ListNode* curNode = head;
while(curNode != NULL){
cout << curNode->val << " -> ";
curNode = curNode->next;
}
cout << "NULL" << endl;
return;
}
// 释放以head为头结点的链表空间
void deleteLinkedList(ListNode* head){
ListNode* curNode = head;
while(curNode != NULL){
ListNode* delNode = curNode;
curNode = curNode->next;
delete delNode;
}
return;
}
int main() {
vector<int> arr1 = {1, 2, 3, 4, 5};
ListNode* res1 = Solution().reverseKGroup(createLinkedList(arr1), 3);
printLinkedList(res1);
deleteLinkedList(res1);
return 0;
}