lettCode

给你一个链表的头节点 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

你可能感兴趣的:(lettCode)