leetcode网解题心得——61. 旋转链表

leetcode网解题心得——61. 旋转链表

一、题目描述

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

试题连接:https://leetcode-cn.com/problems/rotate-list/指针

二、算法分析:

为了完成该算法,在进行代码编写时先进行了数学分析,下面照片是数学分析的草稿,图可能有些丑。code

下面解释下该图:blog

  1. 因为题目是循环列表,能够将单链表进行打断,组成一个圆圈。而指针所指的方向便是起点。
  2. 模拟循环,由循环后的结果能够得出,若是循环次数刚好为一圈时等于没循环。
  3. 同时,能够很简单的看出,k=几,就至关于顺时针转动k步
  4. 因为单链表只是一侧的,在图上更方便逆时针转动,所以可计算出逆时针转动的步数=角-k

三、用天然语言描述该算法

  1. 先求得链表的长度,即为多边形角度
  2. 遍历单链表,到最后一个位置,而后将指向修改成指向头结点,打形成环形链表
  3. 由分析计算出来的公式,逆时针将辅助指针旋转角度-k-1步,位于所要的结果前一个
  4. 保存下一个结点,由于打断后没法过去,须要先保存
  5. 打断循环链表,返回保存的结点

四、java语言实现

public static ListNode rotateRight(ListNode head, int k) {
        if(head == null) return null;
        //1,须要知道链表的长度
        ListNode pCurrent = head;
        int count = 1;
        while(pCurrent.next != null) {
            //计数
            count++;
            //向下
            pCurrent = pCurrent.next;
        }
        //循环结束后,指向的是最后一个结点,对接成循环链表
//        System.out.println(count);
        pCurrent.next = head;
        //指向头,循环链表
        pCurrent = pCurrent.next;
        //计算有效循环
        int total = k % count;
        //计算顺转次数
        total = count - total;
//        System.out.println(total);
        for(int i = 1;i < total;i++) {
            pCurrent = pCurrent.next;
        }
        //保存下一个结点
        ListNode saveNode = pCurrent.next;
        pCurrent.next = null;
        return saveNode;
    }

算法效果:内存

算法分析,时间上还行,可是空间上消耗较大。leetcode

五、C语言实现

struct ListNode* rotateRight(struct ListNode* head, int k){
    if(head == NULL) return NULL;
    //1,须要知道链表的长度
    struct ListNode* pCurrent = head;
    int count = 1;
    while(pCurrent->next != NULL) {
        //计数
        count++;
        //向下
        pCurrent = pCurrent->next;
    }
    //循环结束后,指向的是最后一个结点,对接成循环链表
//        System.out.println(count);
    pCurrent->next = head;
    //指向头,循环链表
    pCurrent = pCurrent->next;
    //计算有效循环
    int total = k % count;
    //计算顺转次数
    total = count - total;
//        System.out.println(total);
    for(int i = 1;i < total;i++) {
        pCurrent = pCurrent->next;
    }
    //保存下一个结点
    struct ListNode* saveNode = pCurrent->next;
    pCurrent->next = NULL;
    return saveNode;
}

算法效果:get

算法分析:根据C语言的提交结果可知,在时间和内存消耗上都较为通常数学

相关文章
相关标签/搜索