让我们荡起链表的双桨-链表进阶训练彻底拿捏

🍻每日一练针对于想要丰富自己相关知识和语法的小伙伴们🍻
🍹可以选择性观看,小博主尽力做到每个知识点详细讲解和拓展🍹
🎄文章尽可能声形并茂,还要靠各位小伙伴们三连改善🎄
💌小博主在这里感谢各位大佬啦!!!💌


🌟前言

在这里插入图片描述
最近一致在做关于链表和递归的东西,做一件东西我的原则就是要做到精致一点,今天我们就再来用两道题丰富一下我们的知识吧。

🌟初始问题及解答

✨问题

最近我们又遇到了个链表的问题,那就是如何翻转链表。对于单纯的翻转链表我相信还是比较简单的。
在这里插入图片描述
这里解释一下就是我们利用迭代和指针的方法进行遍历链表然后逐个翻转。

✨解答代码
pre=None
cur=head
while cur:#当cur存在的时候
    next=cur.next#相当于定义next指针
    cur.next=pre#这里就完成了翻转的操作把箭头指向了pre
    pre=cur#指针移动
    cur=next#指针移动
return pre

代码请参考上方图片进行观看更简单更清晰。如果到这里你就认为本次链表就结束了 那就大错特错了
在这里插入图片描述

🌟进阶问题及解答

✨问题

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
在这里插入图片描述
其实,从宏观的视角上来说,链表具有天然的递归属性,因为一个链表,可以看作是由一个节点和另外一个链表构成,即我们所谓的递归中的子问题。子问题找到了,那么我们就去看终止条件。
由于本题k个一组反转链表,所以我们的想法就是使用递归来完成这个题目,对于给定的链表除去前面k个节点,剩余的节点组成的链表依旧满足k个一组反转链表的这个条件,这就是我们这道题的子问题。
那么我们如何去除k个节点呢?
这就用到了我们上次中讲到的遍历链表链表问题

nextHead=head#令nextHead等于头节点
count=0
while count<k:
    count+=1
    nextHead=nextHead.next#移动

当然这里我们运行到最后的时候很有可能出现剩余的点的个数小于k,那么我们上述的这个过程设定的指针就会指向空,就会报错,所以我们当遇到这种情况的时候,就直接返回,不需要对这些节点进行翻转。

nextHead=head#令nextHead等于头节点
count=0
while count<k:
    if not nextHead:
        return head
    count+=1
    nextHead=nextHead.next#移动

这里终止条件我们也判断完成了,那么就是中间翻转的操作了。同上方一致但是我们这里要加上一个k的范围:

pre=None
cur=head
for i in range(k):
    next=cur.next
    cur.next=pre
    pre=cur
    cur=next
return pre

那么我们来组合下代码:

✨完整代码
def reverseTopN(self,head,k):
        pre=None
        cur=head
        for i in range(k):
            next=cur.next
            cur.next=pre
            pre=cur
            cur=next
        return pre
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        nextHead=head
        count=0
        while count<k:
            if not nextHead:
                return head
            count+=1
            nextHead=nextHead.next
        subList=self.reverseKGroup(nextHead,k)
        newHead=self.reverseTopN(head,k)
        head.next=subList
        return newHead

🌟举一反三

那么如果不够k个也进行翻转呢我们只需要对上方代码哪里就行更改就可以了呢?
在这里插入图片描述

def reverseTopN(self,head,k):
        pre=None
        cur=head
        for i in range(k):
            next=cur.next
            cur.next=pre
            pre=cur
            cur=next
        return pre
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        nextHead=head
        count=0
        while count<k:
            if not nextHead:
                break
            count+=1
            nextHead=nextHead.next
        subList=self.reverseKGroup(nextHead,k)
        newHead=self.reverseTopN(head,k)
        head.next=subList
        return newHead

我们只需要在判断是否足够k的条件中直接break,而不是返回return head这样就完成了这个思路。

🍻每日一练针对于想要丰富自己相关知识和语法的小伙伴们🍻
🍹可以选择性观看,小博主尽力做到每个知识点详细讲解和拓展🍹
🎄文章尽可能声形并茂,还要靠各位小伙伴们三连改善🎄
💌小博主在这里感谢各位大佬啦!!!💌

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃猫的鱼python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值