📜  门| GATE-CS-2007 |第 85 题(1)

📅  最后修改于: 2023-12-03 14:58:27.705000             🧑  作者: Mango

题目描述

题目来源:GATE-CS-2007

给定一个单链表和一个整数K,实现一个函数,将链表尾部的K个节点旋转到链表的头部。

函数原型
def rotate_linked_list(head: ListNode, k: int) -> ListNode:
    pass
输入格式

函数接受两个参数:

  • head:链表头节点,类型为 ListNode
  • k:整数,表示需要旋转的节点个数。

链表节点定义如下:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
输出格式

函数应该返回一个新的链表头节点,代表已经完成旋转的链表。

示例

输入:

head = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
k = 2
rotate_linked_list(head, k)

输出:

ListNode(4, ListNode(5, ListNode(1, ListNode(2, ListNode(3)))))
解题思路

首先计算链表长度 $n$,然后将链表首位相连,形成一个环,接着将尾结点指针向前移动 $n-k$ 个位置,新的尾结点即为旋转后的链表尾结点。最后断开环并返回新的链表头节点即可。

具体实现可参考以下代码:

def rotate_linked_list(head: ListNode, k: int) -> ListNode:
    if not head or not head.next or k == 0:
        return head

    # 计算链表长度 n
    n = 1
    p = head
    while p.next:
        n += 1
        p = p.next

    # 将链表首位相连
    p.next = head

    # 尾指针向前移动 n-k 个位置
    for i in range(n - k % n):
        p = p.next

    # 新的链表头和链表尾
    new_head = p.next
    p.next = None

    return new_head
时间复杂度

该算法只需要遍历一次链表,因此时间复杂度为 $O(n)$。