Leetcode 25. Reverse Nodes in k-Group k个一组翻转链表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28888837/article/details/88377673

Leetcode 25. Reverse Nodes in k-Group k个一组翻转链表

标签(空格分隔): Leetcode


题目地址:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

题目描述

给出一个链表,每 个节点一组进行翻转,并返回翻转后的链表。

是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 = 2 时,应当返回: 2->1->4->3->5

当 = 3 时,应当返回: 3->2->1->4->5

说明 :

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

算法思想

通过题目可以看出来有两个要求:

  • k个一组
  • 翻转

对于k个一组,我们可以通过遍历即可,每隔k个,我们操作一次,而对于翻转,其实可以利用链表的头插法进行,我们对于k个结点,我们可以按照头插法的方法重新组织成一个链表,这样就达到了翻转的目的,然后把每k个再按照尾插法插入到结果链表中即可。
在操作的时候注意,有些结点的值可能会被修改,所以提前存储,并且都最好加上头结点,这样方便插入操作。

在代码中,我们用i控制个数,每次当i%k==0,我们就进行头插法,我们头插法传入的是k个结点的头和尾,并且最终放回一个翻转后的头结点。初始情况pre = last,这个时候说明有一个结点,所以i=1,然后开始遍历,在这个过程中i+=1。注意里面的一些pre_tmp这些都是先临时存储,因为每次我们头插结束,后面的结点都接不上了,所以先临时存储一下。

python代码


class Solution(object):
    def headInsertByN(self,pre,last):
        # 把pre->last之间的结点逆转
        # 其实就是把pre->last进行头插法,最终返回L即可
        L = ListNode(-1)
        L.next = None
        r = pre
        end = last.next
        while pre != end:
            p = pre
            pre = pre.next

            # 头插
            p.next = L.next
            L.next = p

        return L.next,r

    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        # 遍历,每次把部分结点传入上面那个逆转的函数
        # 然后把所有逆转后的结点尾插即可
        L = ListNode(-1)
        L.next = None
        r = L
        pre = head
        last = pre
        i = 1
        while pre and last:
            if i%k ==0:
                pre_tmp = last.next
                p,r_temp = Solution().headInsertByN(pre,last)
                r.next = p
                r = r_temp
                pre = pre_tmp
                last = pre
                i = 1
                continue
            last = last.next
            i+=1
        r.next = pre
        return L.next

参考:https://blog.csdn.net/qq_17550379/article/details/80696835

猜你喜欢

转载自blog.csdn.net/qq_28888837/article/details/88377673