反转链表的题目就是注意细节了,不要不小心对空指针进行操作,注意链表各个结点的操作顺序。在纸上画一遍直接模拟就行了。这题我用递归完成的,为了不每次都计算一遍链表长度以判断是否需要反转,我另写了一个函数,把当前链表长度作为参数输入,以避免递归过程中的重复计算。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverse(ListNode* head, int len, int k)
{
if(lennext:NULL,*post=(now)?now->next:NULL;
now->next=pre;
for(int i=0;inext:NULL;
now->next=pre;
}
head->next=reverse(post,len-k,k);
head=now;
return head;
}
ListNode* reverseKGroup(ListNode* head, int k) {
if(k==1||!head)
return head;
ListNode *temp=head;
int len=0;
while(temp)
{
temp=temp->next;
len++;
}
return reverse(head,len,k);
}
};