Leetcode之 K个一组翻转链表

题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

思路

递归法:
首先从起点出发,找到第k个结点,若寻找途中链表到了NULL,则返回Head即可,不做修改;
找到第k个结点定义为end,先保存end的下一个结点和head的下一个结点,之后将head->next开始到end前一个结束的链表反转,直接递归k-2即可。需要注意的是我们要在递归前将k的下一个结点定为NULL,否则这次k-2递归会改变end之后元素的顺序。然后将end->next指向k-2反转后的头部,k-2反转后的尾巴指向head,至此完成了head->end部分的反转,同时没有对end之后的元素产生影响。之后将head->next指向end原来的next即可

代码:

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (head == NULL)
            return NULL;
        if (k == 0)
            return NULL;
        if (k == 1)
            return head;
        ListNode* front = head;
        ListNode* cur = head;
        ListNode* end;
        int m = k;
        while (m>1)
        {
            if (cur->next)
                cur = cur->next;
            else
                return head;
            m--;
        }
        end = cur;
        ListNode* next = end->next;
        ListNode* front_next = front->next;
        end->next = NULL;
        end->next = reverseKGroup(front->next, k - 2);
        front_next->next = front;
        front->next = reverseKGroup(next, k);

        return end;
    }
};
发布了95 篇原创文章 · 获赞 0 · 访问量 1515
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览