LeetCode 25. K 个一组翻转链表

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

LeetCode 25. K 个一组翻转链表_第1张图片

题目解析

        创建一个哨兵位头结点,然后将其链接在原来头结点的前边,以便于我们后面的便利使用。

        每次翻转一小段之前首先判断一下接下里我们要翻转的这一小段的长度是否符合条件,若不符合直接返回头结点。

        若符合,则仿照反转链表的方式(头插法)来进行一小段一小段的反转链表。

代码

/**
 * 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;inext;
                if(last==nullptr) return hair->next;
            }
            // 仿照反转链表的方式进行头插法的反转链表
            ListNode* cur=prev->next;
            ListNode* next;
            for(int i=0;inext;
                cur->next=next->next;
                next->next=prev->next;
                prev->next=next;
            }
            // 更新prev结点
            prev=cur;
        }

        
    }
};

你可能感兴趣的:(算法练习,leetcode,链表,算法)