题解 | #链表中的节点每k个一组翻转#O(n) O(1)
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @param k int整型
# @return ListNode类
#
class Solution:
def reverseKGroup(self , head: ListNode, k: int) -> ListNode:
# write code here
# 与任意区间反转一致,设定三个指针
# pre; cur cur_next
# 当一个反转结束后,cur即变成下一个的 pre
# 设置一个指针先行,如果够K个,则对此区间,进行反转,如果不够K个则无需反转
new_head = ListNode(-1)
new_head.next = head
cur = head
pre = new_head
pre_k = head
while pre_k:
i = 1
while pre_k and i <= k:
pre_k = pre_k.next
i+=1
# 够k个,多走一步,防止返回,如果远远不够k个,则i小于k+1,如果刚好够k个,则i==k+1
if i==k+1:
# 对此区间进行反转
for j in range(k-1):
cur_next = cur.next
cur.next = cur_next.next
cur_next.next = pre.next
pre.next = cur_next
pre = cur
cur = cur.next
# # 结尾不够k个
# if !pre_k or i!=k:
# return new_head1.next
return new_head.next
与任意区间反转方法一样,使用三个指针完成任意区间反转,此题目,额外增加一个判断,是否需要对此区间进行反转,如果数目有k个,则需要对此区间进行翻转,否则不需要。