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){//判断剩余节点个数是否大于等于kif(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
个结点进行一次翻转,使用迭代的方式也是可以的,使用递归只是更好实现而已。