25. K 个一组翻转链表

25. K 个一组翻转链表

这道题居然是困难,回想起做过的其他困难题这个绝对是我做过最简单的困难题。

解决这个问题首先是需要解决如何翻转链表的问题,参考leetcode206

其实绝大多数人都可以想到最简单的翻转方法(大家更喜欢叫做迭代的方式):

ListNode * reverseListNode(ListNode * head){
    if(head == nullptr) return nullptr;
    if(head->next == nullptr) return head;
    ListNode * prevNode  = nullptr;
    ListNode * currentNode = head;
    while(currentNode!=nullptr){
        ListNode * tmpNode = currentNode->next;
        currentNode->next = prevNode;
        prevNode = currentNode;
        currentNode = tmpNode;
    }
    return prevNode;
}

当然这里还有一种解法(递归解法):

ListNode* reverseList(ListNode* head) {
    if(head == nullptr){
        return nullptr;
    }
    if(head->next == nullptr){
        return head;
    }
    auto last = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return last;
}

其实这里的head->next->next = head是最难理解的:

不要跳进递归呢!!!

我们假设说这个reverseList(head->next);这一句代码已经把node2之后的链表已经翻转。结果如下:

 

执行完head->next->next = head;  head->next = nullptr;如下所示:

注意红色箭头。

其实对比起来迭代的好理解又没有栈溢出的风险。迭代方法你值得拥有。

其实这么一想,递归方法千万不要跟着走入递归。

人脑能压几个栈?(教皇他有几个师?笑)

剩余内容请看24. 两两交换链表中的节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值