题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
创建一个哨兵位头结点,然后将其链接在原来头结点的前边,以便于我们后面的便利使用。
每次翻转一小段之前首先判断一下接下里我们要翻转的这一小段的长度是否符合条件,若不符合直接返回头结点。
若符合,则仿照反转链表的方式(头插法)来进行一小段一小段的反转链表。
代码
/**
* 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)
{
// 首先创建一个带头的结点
ListNode* hair=new ListNode(0);
// 将该结点指向原头结点
hair->next=head;
ListNode* prev=hair;
while(true)
{
// 若此时剩下的结点数小于k则直接返回即可
ListNode* last=prev;
for(int i=0;i<k;i++)
{
last=last->next;
if(last==nullptr) return hair->next;
}
// 仿照反转链表的方式进行头插法的反转链表
ListNode* cur=prev->next;
ListNode* next;
for(int i=0;i<k-1;i++)
{
// 保存cur的next结点防止一会儿丢失
next=cur->next;
cur->next=next->next;
next->next=prev->next;
prev->next=next;
}
// 更新prev结点
prev=cur;
}
}
};