解决方法:
递归!!
参见链表的翻转的递归解决;
写了个函数来翻转链表中的k个元素,并返回头指针
再使用递归进行整个链表的解决。注意最后递归的跳出条件,在头尾不满k个时进行递归的回归过程
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
主要函数代码如下,注意找到第k个节点是i=1开始
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
int i=1;
ListNode *tail=head;
while(i<k && tail!=NULL)
{
tail=tail->next;
i++;
}
if(tail==NULL)
return head;
//为啥写tail==NULL就可以通过测试用例[1,2,3,4,5],2;写i!=k就不行??
有可能i==k的时候刚好tail==NULL
tail=head; //注意反转前head1,tail2,先把tail弄成1
head=rev(head,k); //反转后head2
tail->next=reverseKGroup(tail->next,k);
return head;
}
调用反转k的函数如下,注意i=1开始
ListNode* rev(ListNode* head,int k)
{
ListNode* neww=head;
ListNode* old=neww->next;
for(int i=1;i<k;i++)
{
ListNode* tmp=old->next;
old->next=neww;
neww=old;
old=tmp;
}
head->next=old;
head=neww;
return head;
}
};
遇到的问题,测试用例
[1,2,3,4,5] 2
开始没通过,是因为开始写的i!=k进行回归。