- 链表模拟题
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution
{
public:
ListNode* reverseKGroup(ListNode* head, int k)
{
int len = 0;
ListNode* cur = head;
while(cur != nullptr)//计算链表长度
{
++len;
cur = cur->next;
}
int start = 1;
ListNode* res = head;
while(start + k - 1 <= len)
{
res = reverseBetween(res, start, start + k - 1);
start += k;
}
return res;
}
private:
ListNode* reverseBetween(ListNode* head, int left, int right)
{
ListNode* dummyNode = new ListNode(0);
dummyNode->next = head;
ListNode* g = dummyNode;//初始化指针
ListNode* p = dummyNode->next;
for(int i = 0; i < left - 1; ++i)//找到 局部反转链表 的左边界
{
g = g->next;//将 g 移动到第一个要反转的节点的前面
p = p->next;//将 p 移动到第一个要反转的节点的位置上
}
for(int i = 0; i < right - left; ++i)//头插法插入节点
{
ListNode* removed = p->next;
p->next = p->next->next;
removed->next = g->next;
g->next = removed;
}
return dummyNode->next;
}
};
/*
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
*/