📅  最后修改于: 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)$。