leetcode 61. 旋转链表

题目描述

给定一个链表,旋转链表,将链表每个节点向右移动 *k *个位置,其中 *k *是非负数。

示例 1:

**输出:** 4->5->1->2->3->NULL
**解释:**
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL

示例 2:

输入:** 0->1->2->NULL, k = 4
**输出:** `2->0->1->NULL`
**解释:**
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: `0->1->2->NULL`
向右旋转 4 步: `2->0->1->NULL`

解体思路:

本题为链表的重新构造问题,链表指针的向右或者向左移动K步,首先要计算出移动后的头指针位置m。将头指针指向该位置m然后将链表的尾部指向初始状态的头部形成循环链表 ,最后再把位置m之前的节点的下一个指针指向NULL 作为结尾,构造完成。

头指针位置m的确定(计算):

如果向右移动比较简单只要将指针位置按照链表的方向移动K步如果到达队尾,则可以通过模运算 重新指向头部继续移动所以

m = k%lenList

如果方向做移动则稍微复杂 需要先用队列长度减去移动步数K后得到左移的位置 ,最后为了防止超出头尾部分也需要做一次摸操作公式如下:

m = (lenList - k%lenList)%lenList

程序代码

class Solution(object):
    def rotateRight(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
 
        if  not head : return None
        lenList = 0
        p,ptmp = head,head;
        while p :
            p=p.next
            lenList +=1
        # m起始的位置
        m  = (lenList - k%lenList)%lenList
        p = head
        while m > 0 :
            p=p.next
            m-=1
        head = p # 把头指针放到相应起始位置
        while lenList>0 :
            if  not p.next:
                p.next = ptmp
            else:
                p  = p.next

            lenList -=1
        p.next = None
        return head
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 61. 旋转链表给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例:输入: 1-...
    杏仁小核桃阅读 1,562评论 0 0
  • 题目地址:https://leetcode-cn.com/problems/rotate-list/ 题目: 给定...
    monkey01阅读 3,663评论 0 0
  • 题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 示例 1:输入: 1...
    大数据Zone阅读 1,441评论 0 0
  • 作者: 码蹄疾毕业于哈尔滨工业大学。 小米广告第三代广告引擎的设计者、开发者;负责小米应用商店、日历、开屏广告业务...
    码蹄疾阅读 1,742评论 0 0
  • 第一次跟你见面是在七餐三楼,工作室纳新,约在那面试;从跟你短信联系面试地点开始,到面试结束,小淑女一枚,跟我气质一...
    上古村阅读 2,990评论 0 0

友情链接更多精彩内容