首页 > 其他分享 >61. 旋转链表(中)

61. 旋转链表(中)

时间:2024-01-29 15:55:53浏览次数:27  
标签:head fast next 链表 61 tail 旋转 节点

目录

题目

  • 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

法一、k次头插法

  • 把链表尾的元素取下来头插法放到链表头,k为几就循环几次
class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head or not head.next or k == 0:#如果链表为空或只有一个节点,或者k为0,直接返回原链表头部。
            return head
        # 计算链表的长度
        length = 1
        tail = head
        while tail.next:
            length += 1
            tail = tail.next
        # 将k转换为等效的右移步数
        k = k % length
        if k == 0:#如果k等于链表长度的倍数,相当于没有旋转,直接返回原链表头部。
            return head 
        # 执行k次循环
        for _ in range(k):
            # 取下尾节点
            tail = head
            while tail.next.next:#使用一个循环找到尾节点的前一个节点
                tail = tail.next
            new_head = tail.next
            tail.next = None#将尾节点取下并断开与之前节点的连接,使其成为新的头节点。
            # 头插法
            new_head.next = head#将新的头节点的next指针指向原来的头节点
            head = new_head#更新头节点为新的头节点。
        return head

法二、快慢指针

class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head or not head.next or k == 0:
            return head
        # 计算链表的长度
        length = 1
        tail = head
        while tail.next:
            length += 1
            tail = tail.next   
        # 将k转换为等效的右移步数
        k = k % length        
        if k == 0:
            return head       
        # 找到倒数第k个节点
        fast = slow = head
        for _ in range(k):
            fast = fast.next       
        while fast.next:#将快指针移动到链表的最后一个节点,而慢指针 slow 则移动到了倒数第k个节点的前一个节点
            fast = fast.next
            slow = slow.next
        # 重新连接链表
        new_head = slow.next
        slow.next = None
        fast.next = head
        return new_head

标签:head,fast,next,链表,61,tail,旋转,节点
From: https://www.cnblogs.com/lushuang55/p/17994705

相关文章

  • Unity_物体对象跟随鼠标移动360°旋转
    ///<summary>///对象旋转跟随鼠标移动///</summary>publicvoidObjectRotateFollowMouseMove(){if(Input.GetMouseButtonDown(0)){lastMousePoint=Input.mousePosition;}elseif(Input.Get......
  • 160. 相交链表
    目录题目题解:双指针题目题解:双指针思路:计算两条链表的长度,找到长度差,让长的链表多走差的值,返回第一个相等的元素classSolution:defgetIntersectionNode(self,headA:ListNode,headB:ListNode)->Optional[ListNode]:count1,count2=0,0pa=head......
  • 148. 排序链表(中)
    目录题目法一、冒泡排序法二、归并排序题目给你链表的头结点head,请将其按升序排列并返回排序后的链表。法一、冒泡排序冒泡排序:两个for循环,i从头开始,j在i后一位开始,比较如果j小于i就交换,否则i往后移classSolution:defsortList(self,head:Optional[ListNo......
  • 【算法】004_链表
    哈希表哈希表增删改查是常数时间,但是这个常数时间比较大放入哈希表的东西,如果是基础类型,内部按值传递,内存占用就是这个东西的大小放入哈希表的东西,如果不是基础类型,内部按引用传递,内存占用就是这个东西的内存地址的大小有序表有序表的增删改查是O(logn)级别的放入有序表......
  • (4/60)两两交换链表结点、删除链表倒数第N个结点、链表相交、环形链表
    两两交换链表结点leetcode:24.两两交换链表中的节点迭代法思路第一步cur->next=cur->next->next第二步cur->next->next=原cur->next第三步cur->next->next->next=原cur->next->next->next注意用临时变量保存指针位置。复杂度分析时间复杂度:O(N)。空间复杂度:O(1)。......
  • 链表操作
    代码随想录移除元素。不设置虚拟头节点,分类讨论。structListNode*removeElements(structListNode*head,intval){structListNode*temp;//当头结点存在并且头结点的值等于val时while(head&&head->val==val){temp=head;//将新的头结点设置为head->next并删......
  • P1561 [USACO12JAN] Mountain Climbing S
    P1561[USACO12JAN]MountainClimbingS贪心思路首先我们设\(c_i\)为第\(i\)头牛上山后又下山的时间。那么有两种情况,我们分类讨论。第\(i\)头牛上到山顶时,第\(i-1\)头牛还未下到山脚。第\(i-1\)头牛下山完毕但第\(i\)头牛还在上山。那么\(c_i\)的公式......
  • 143. 重排链表(中)
    目录题目题解:双指针+翻转链表题目给定一个单链表L的头节点head,单链表L表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。题解:双指针+翻转......
  • 142. 环形链表 II(中)
    目录题目题解:双指针题目给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。题目链接:24.两两交换链表中的节点-力扣(LeetCode)建议画图,会更清晰一些。同时注意交换问题要用两个临时节点。class......