题意:给一个单链表,每k个节点就将这k个节点反置,若节点数不是k的倍数,则后面不够k个的这一小段链表不必反置。
思路:递归法。每次递归就将k个节点反置,将k个之后的链表头递归下去解决。利用原来的函数接口即可,不用重新定义。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(k==) return head;
ListNode* p=head;
int cnt=;
while(cnt!=k && p) //找到下一段的链表头
{
cnt++;
p=p->next;
}
if(cnt==k) //进行反置
{
ListNode* nextp=head->next, frontp=head, qq;
while(nextp!=p) //p是下一段链表的开头
{
qq=nextp->next;
nextp->next=frontp;
frontp=nextp;
nextp=qq;
}
head->next=reverseKGroup( p ,k );
return frontp; //返回新链表的头指针
}
else return head; //不够k个
}
};
AC代码