LeetCode:25. K 个一组翻转链表
这个题很像24. 两两交换链表中的节点 和 206. 反转链表 的合并体。
在力扣hot100:24. 两两交换链表中的节点中我们使用递归来实现这个问题是很方便的,使用迭代在k
个结点一组时就不太好使了,我们可以采用递归的方式,然后每一组内部使用反转链表
的方法来翻转即可。
为了避免重复遍历结点判断剩余节点个数是否大于等于k
,我们直接遍历一次,来记录结点总数,然后记录当前使用了多少节点,两数相减就是剩余的节点数量。
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
this->k = k;
//获得结点总数
for(ListNode * p = head; p != nullptr; p = p->next)
++Node_num;
return getans(head,0);
}
private:
ListNode * getans(ListNode * head, int cur_num){
//判断剩余节点个数是否大于等于k
if(Node_num - cur_num < k) return head;
//反转链表
ListNode * pre = head;
ListNode * p = head->next;
int i = 1;//表示遍历到第几个结点
while(i ++ < k){//反转k个即可
ListNode * temp = p ? p->next : nullptr;
p->next = pre;
pre = p;
p = temp;
}
//反转下一组并连接
head->next = getans(p, cur_num + k);
return pre;
}
private:
int Node_num = 0;
int k;
};
当然每k
个结点进行一次翻转,使用迭代的方式也是可以的,使用递归只是更好实现而已。