给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
提示:
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
https://leetcode.cn/problems/rotate-list/
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
# head 为可选值或者None,若为可选值,其类型为Listnode
def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
# head 为 None,则直接返回
if head is None:
return head
# 遍历链表获取其长度
_len = 0
tmpHead = head
while tmpHead:
_len += 1
tmpHead = tmpHead.next
#定义前后两个指针,初始化都指向链表头部
# 由于K可能远大于链表的长度,所以先对K求模,得出真正需要移动的步骤为step
former = later = head
step = k % _len
if step == 0:
return head
# 先移动step步前指针
for i in range(step):
former = former.next
# 再同时移动前后指针,直到前指针已在链表尾节点
while former and former.next:
later = later.next
former = former.next
# 此时,链表从从 later指针处断开
# 新链表的头部指向later+1 节点
# 同时,链表尾节点为 later
newHead = later.next
later.next = None
former.next = head
return newHead
知识点
Optional:
官方原话:可选参数具有默认值,具有默认值的可选参数不需要在其类型批注上使用 Optional,因为它是可选的
不过 Optional 和默认参数其实没啥实质上的区别,只是写法不同
使用 Optional 是为了让 IDE 识别到该参数有一个类型提示,可以传指定的类型和 None,且参数是可选非必传的
Optional[int] 等价于 Union[int, None]
意味着:既可以传指定的类型 int,也可以传 None