📅  最后修改于: 2023-12-03 15:37:15.862000             🧑  作者: Mango
这是一道关于链表的编程题。
给定一个单向链表和一个正整数k,翻转链表中的每k个节点,并且返回修改后的链表。
例如,给定链表1->2->3->4->5,k的值为2,则应该返回2->1->4->3->5。
注意:
第一行包含两个整数n和k,分别表示链表长度和要翻转的节点个数。
第二行包含n个整数,表示链表中每个节点的值。
输出修改后的链表,每个节点的值用空格隔开。
5 2
1 2 3 4 5
2 1 4 3 5
本题可以通过遍历链表,每k个节点反转一次来实现。先定义一个指向头节点的指针 p
,遍历整个链表计算出链表的长度 n
,然后反转每k个节点。
对于每k个节点的反转,需要先将当前节点 p
和下一个节点 p->next
的指针保存,然后将当前节点指向第 k+1
个节点,并将下一个节点 p->next
指向上一个节点,依次反转每k个节点,最后修改头节点指针即可。
注意,最后剩余的节点应该原封不动,所以需要计算出剩余节点数,如果不足k个节点,则不进行反转操作。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseKGroup(head: ListNode, k: int) -> ListNode:
# 计算链表长度
n, p = 0, head
while p:
n += 1
p = p.next
# 反转链表
dummy = ListNode(-1)
dummy.next = head
pre, cur = dummy, head
for i in range(n // k):
for j in range(k - 1):
nxt = cur.next
cur.next = nxt.next
nxt.next = pre.next
pre.next = nxt
pre = cur
cur = cur.next
return dummy.next