Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For 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
/**
* 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) {
if(head == nullptr || head->next == nullptr || k <= 1) return head;
int len = 0, n = k;
ListNode *p = head;
while(p)
{
len++;
p = p->next;
}
if(n > len) return head;
p = head;
ListNode *pre = nullptr;
while(p && n > 0)
{
ListNode *pNext = p->next;
p->next = pre;
pre = p;
p = pNext;
n--;
}
if(len - k >= k)
head->next = reverseKGroup(p, k);
else
head->next = p;
return pre;
}
};

本博客介绍了一种算法,用于反转给定链表中连续的k个节点,并在链表末尾保留未匹配的节点。算法仅使用常量内存,并保持原始节点值不变。
3228

被折叠的 条评论
为什么被折叠?



