题目描述
leetcode题目25,描述如下
/*
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
*/
解题思路
这道题我们可以根据逆置单链表的思路来解决:将每k个节点看成一个单链表,从每个单链表的头部开始逆置,注意要保留下一个链表开始的节点,防止丢失。逆置完成一个再将指针后移进行下一个,直到剩余的节点数小于k的时候,将其直接链在之前已经逆置过的链表后面即可。
代码实现
ListNode* reverseKGroup(ListNode* head, int k) {
if(head == NULL || head->next == NULL || k == 0 || k == 1||!judgeLength(head, k)) return head;
ListNode* p = head;
ListNode* q = head->next;
ListNode* first = p;
ListNode* last = NULL;
ListNode* tmp = NULL;
ListNode* ans = NULL;
int time = 1;
while(time < k)
{
tmp = q->next;
q->next = first;
if(time == k-1)
ans = q;
first = q;
q = tmp;
time++;
}
while(tmp != NULL && judgeLength(tmp, k))
{
time = 1;
last = p; p = tmp;
first = p; q = p->next;
while(time < k)
{
tmp = q->next;
q->next = first;
if(time == k-1)
last->next = q;
first = q;
q = tmp;
time++;
}
}
p->next = tmp;
return ans;
}
bool judgeLength(ListNode* p, int length)
{
while(length > 0 && p != NULL)
{
p = p->next;
length--;
}
if(length > 0) return false;
return true;
}