题目 反转链表
给你链表的头节点 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