将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
示例1
输入:
{1,2,3,4,5},2
返回值:
{2,1,4,3,5}
示例2
输入:
{},1
返回值:
{}
递归版题解:
reverseGroup结束条件:
1.head为空或者head->next为空
2.k为1
此外,该函数里需要设一个pre存储翻转前的链表以防所翻转链表长度小于k(不会翻转,需要保持原样)
此外由于是链表,所以经过reverse函数后,head指针所在的位置以及之前的链表已经完成翻转,head->next指的是后面未翻转的链表
reverse结束条件:
1.head为空或者head->next为空
2.k==1
此外,该函数里需要设一个tmp存储后面不需要翻转的链表
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* tmp = NULL;
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* pre = head;//為了防止出現不逆轉的情況==》{1,2},3
// write code here
if (!head || !head->next || k == 1) return head;
ListNode* ans = reverse(head, k);
if(!ans) return pre;//不需要逆转了
pre = head->next;
ListNode* next=reverseKGroup(head->next, k);
head->next = next?next:pre;//拼接
return ans;
}
//翻转从head指针开始,长为k的链表,之后的链表不需要翻转
ListNode* reverse(ListNode* &head, int k) {
if (!head || !head->next)
if(k>1) return NULL; //长度小于K,不逆转了
else return head;
if (k == 1) {
tmp = head->next;
return head;
}
ListNode* new_head = reverse(head->next, k - 1); //子问题,位置要减1
if(!new_head) return NULL;
head->next->next = head; //反转
head->next = tmp; //拼接尾部
return new_head;
}
};