代码:
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
# 找到m到n之间的链表,翻转即可。
if m == n:
return head
# 浅复制指向同一块地址
p = dummy = ListNode(0)
dummy.next = head
# 首先找到翻转的前一个即p
for _ in range(m - 1):
p = p.next
# cur即m位置的链表
pre, cur = None, p.next
# 翻转m到n之间的链表
for _ in range(n - m + 1):
cur.next, pre, cur = pre, cur, cur.next
# 先next.next 再next
p.next.next = cur
p.next = pre
# 上面两行等同于下面一行
# p.next.next, p.next = cur, pre
return dummy.next
迭代法实现k个结点一组翻转链表
class Solution:
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
l, num = head, 0
while l:
num += 1
l = l.next
times = num // k
if not times: return head
def rever(node):
pre, cur = None, node
for _ in range(k):
cur.next, pre, cur = pre, cur, cur.next
return pre, cur
prev = res = ListNode(-1)
prev.next = head
for time in range(times):
rev, suf = rever(prev.next)
prev.next.next = suf
# 要用tmp保留每次翻转的最后一个值,用于后续翻转的前缀
tmp = prev.next
prev.next = rev
prev = tmp
return res.next