206. Reverse Linked List 总结

题目  反转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

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

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

记录一下本人完全个人手撕的hard题目,题目不是很难,但有很多思维可以总结,以免下次再犯。

先说结论:

        1、解耦!解耦!解耦!   涉及到某项功能重复使用,最好将这个功能转化为独立函数

第一眼看见题目觉得很简单直接上手,第一版函数完全耦合未独立反转函数,导致两个变量在多个循环中重复调用,一旦出错就要跟踪错误,靠人脑计算非常耗费时间、精力。

以下为第一版函数

class Solution:
    def reverseKGroup(self , head: ListNode , k: int) -> ListNode:
        if k == 1:
            return head

        dummy = ListNode()
        dummy.next = head
        pre = dummy
        while head:
            temp2 = head
            for i in range(k):
                if not temp2:
                    return dummy.next
                temp2 = temp2.next

            prev = pre
            temp1 = head.next
            head.next = temp2
            pre = head
            head = temp1

            for i in range(k - 1):
                temp1 = head.next
                head.next = pre
                pre = head
                head = temp1
                prev.next = pre
        return dummy.next

       2、先想好大致思路,并尽量细化,哪怕会花费5-15分钟。这是非常值得的,努力方向很重要,方向错了纯白干,也是因为第一眼看着简单,没多想直接上手,导致错误,又反复花费大量时间修改得不偿失。 就像在工程中,技术选型、架构设计失误,会导致严重问题,在错误的方向一路狂奔。

         正解函数,看起来好像还是比较冗余,之后考虑优化一下

# Definition for singly-linked list.

# class ListNode:

#     def __init__(self, val=0, next=None):

#         self.val = val

#         self.next = next

class Solution:

    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:

            dummy = ListNode()

            dummy.next = head

            pre = dummy

            if k == 1:

                return head

            def reverse(pre, head, k):

                tail = head

                for i in range( k ):

                    temp = head.next

                    head.next = pre

                    pre = head

                    head = temp

                begin = pre

                return begin, tail

            while head:

                prev = pre

                temp2 = head

                for i in range (k):

                    if not temp2 :

                        return dummy.next

                    temp2 = temp2.next

                begin, tail = reverse(pre, head, k)

                tail.next = temp2

                prev.next = begin

                pre = tail

                head = temp2

            return dummy.next

        

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值