🍻每日一练针对于想要丰富自己相关知识和语法的小伙伴们🍻
🍹可以选择性观看,小博主尽力做到每个知识点详细讲解和拓展🍹
🎄文章尽可能声形并茂,还要靠各位小伙伴们三连改善🎄
💌小博主在这里感谢各位大佬啦!!!💌
🌟前言
最近一致在做关于链表和递归的东西,做一件东西我的原则就是要做到精致一点,今天我们就再来用两道题丰富一下我们的知识吧。
🌟初始问题及解答
✨问题
最近我们又遇到了个链表的问题,那就是如何翻转链表。对于单纯的翻转链表我相信还是比较简单的。
这里解释一下就是我们利用迭代和指针的方法进行遍历链表然后逐个翻转。
✨解答代码
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这样就完成了这个思路。
🍻每日一练针对于想要丰富自己相关知识和语法的小伙伴们🍻
🍹可以选择性观看,小博主尽力做到每个知识点详细讲解和拓展🍹
🎄文章尽可能声形并茂,还要靠各位小伙伴们三连改善🎄
💌小博主在这里感谢各位大佬啦!!!💌