如何利用小游戏调试工具提升小程序开发效率,提升开发效率与合规性
742
2022-09-20
LeetCode 25. K 个一组翻转链表 | Python(leetcode官方app)
25. K 个一组翻转链表
题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
题目
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
解题思路
思路:迭代、翻转链表
具体思路:
首先要确保翻转的范围,这个是由题目中提及的 k 来控制;
关于链表的翻转,要注意前驱和后继的问题,防止指向错误,这里也为了将翻转后的链表与后续进行连接;
定义 pre 和 tail,pre 表示待翻转链表部分的前驱,tail 表示末尾;
上面的 tail 经由 k 控制到达末尾;
翻转链表,将翻转后的部分与后续进行拼接;
注意:根据题意,当翻转部分的长度小于 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 and head.next == None and k < 2:
return head
# 定义哨兵节点
dummy = ListNode(0)
# 指向节点
dummy.next = head
# 定义前驱后继节点
pre = dummy
tail = dummy
# 控制 tail 到待翻转链表部分的末尾
while True:
count = k
while count > 0 and tail != None:
count -= 1
tail = tail.next
# 到达尾部时,长度不足 k 时,跳出循环
if tail == None:
break
# 这里用于下次循环
head = pre.next
# 开始进行翻转
while pre.next != tail:
tmp = pre.next
pre.next = tmp.next
tmp.next = tail.next
tail.next = tmp
# 重置指针
pre = head
tail = head
return dummy.next
实现结果
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~