反转链表的题还挺多的。也算是做出点感觉来了。
LEETCODE206.反转链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class Solution: def reverseList(self, head: ListNode) -> ListNode: if not head:return None prev= None while head: next_p = head.next head.next=prev prev=head head=next_p return prev
|
LEETCODE92 反转链表II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
大体思路: 移动m格 找到prev 移动m-n 格找到后续 然后反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution: def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode: def reverse(tail,head): prev=tail.next cur=head while prev!=tail: next_p = cur.next cur.next=prev prev=cur cur=next_p return head,tail
dummy = ListNode(0) dummy.next =head prev=dummy for i in range(m-1): prev=prev.next cur_head =prev.next tail=cur_head for i in range(n-m): tail=tail.next next_p = tail.next tail,cur_head=reverse(tail,cur_head) tail.next=next_p prev.next=cur_head return dummy.next
|
LEETCODE25 K个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
大体思路:和上面一题还是蛮像的。就是不用提前走m,直接走k
总是能踩到莫名的坑 昨天是参数位置错了。今天是被prev和pre坑了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
class Solution: def reverse(self,head,tail): prev=tail.next cur=head while prev!=tail: next_p=cur.next cur.next=prev prev=cur cur=next_p return tail,head def reverseKGroup(self, head: ListNode, k: int) -> ListNode: dummy = ListNode(0) dummy.next =head prev=dummy while head: tail =prev for i in range(k): tail=tail.next if not tail:return dummy.next nex = tail.next head,tail=self.reverse(head,tail) prev.next=head tail.next=nex prev=tail head=tail.next
return dummy.next
|
LEETCODE24.两两交换列表中的节点
那这不就是K=2吗
太麻烦了 不如正常解~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution: def swapPairs(self, head: ListNode) -> ListNode: return self.reverseKGroup(head,2) def reverse(self,head,tail): prev=tail.next cur=head while prev!=tail: next_p=cur.next cur.next=prev prev=cur cur=next_p return tail,head def reverseKGroup(self, head: ListNode, k: int) -> ListNode: dummy = ListNode(0) dummy.next =head prev=dummy while head: tail =prev for i in range(k): tail=tail.next if not tail:return dummy.next nex = tail.next head,tail=self.reverse(head,tail) prev.next=head tail.next=nex prev=tail head=tail.next
return dummy.next
|
嘿嘿 再有其他的翻转链表我也不至于不会了