Leetcode 25:Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

Example:

Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

 

这道题与普通的反转链表类似,不同的是这里我们是每k个元素做反转,也就是需要分为划出反转区域k个元素以及反转两步。以题中k=3为例,开始为1-2-3-4-5,因为反转链表的时候头尾都会变,所以在头加上一个辅助节点-1:

-1-1-2-3-4-5

和反转类似,我们用pre指向-1,cur指向1,然后开始cur向后遍历直到走过k个,这时候cur走过的区域就是我们需要反转的区域。想象一下反转后的结果我们要让这段区域的原始末尾作为头节点,原始开始作为尾节点,也就是1-2-3中,反转成3-2-1。但是我们还需要把反转后的链表和原链表不能断开,反转后要让-1指向3,1指向4。所以在反转的时候,我们传入的区域是比k个左右各多一个,以使反转的区域能连上原链表。

在反转链表操作中,我们传入的是-1-1-2-3-4,我们要让反转后的尾是1,所以使用last=1保存最后要返回的节点。然后cur=last.next=2. 然后开始交换,首先是1和2,我们让last.next指向3,也就是cur的后面,然后改变cur的next=pre.next=1,然后pre.next=cur,cur.last.next,这样cur往后推进了一个元素,last没有变,但是last指向的元素为cur的后面。最后的样子是-1-3-2-1-4,正好是我们想要的结果,然后我们返回last,last将作为下一组k区间中的开始。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        
        if head==None or k==1:
            return head
        node=ListNode(-1)
        node.next=head
        pre=node
        cur=head
        i=1
        while cur!=None:
            if i%k==0:
                pre=self.reverseOneGroup(pre,cur.next)
                cur=pre.next
            else:
                cur=cur.next
            i+=1
        return node.next
    
    
    def reverseOneGroup(self,pre,next):
        last=pre.next
        cur=last.next
        while cur!=next:
            last.next=cur.next
            cur.next=pre.next
            pre.next=cur
            cur=last.next
        return last

参考:https://www.cnblogs.com/grandyang/p/4441324.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值