📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 – 5 月 |问题 8(1)

📅  最后修改于: 2023-12-03 15:37:15.862000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2017 – 5 月 | 问题 8

这是一道关于链表的编程题。

题目描述

给定一个单向链表和一个正整数k,翻转链表中的每k个节点,并且返回修改后的链表。

例如,给定链表1->2->3->4->5,k的值为2,则应该返回2->1->4->3->5。

注意:

  • 如果链表中的节点数不是k的倍数,则最后剩余的节点应该原封不动。
  • 不要修改链表中的节点值,只能进行节点交换。
  • 你不能更改链表的头节点指针。
输入格式

第一行包含两个整数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
参考链接