茄子算法每日N题之LeetCode61.旋转链表

LeetCode 61.旋转链表

你们好,我是灵魂画师--茄子。技术水平通常,喜欢画画。指针

开始今天的正题。code

leetCode61.旋转链表leetcode

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

示例 1:io

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

示例 2:class

输入: 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技术

解法:链表

1.快慢指针解法

思路:next

  1. 设立一个慢指针,设立一个快指针
  2. 快指针先走k步,而后快慢指针一块儿移动到链表的结尾
  3. 快指针指向head,慢指针处断开
let rotateRight = function(head, k) {
        if (!head) return null;
        let pre = head;
        let cur = head;
        let i = 0;
        while(i < k){ // 快指针走k步,若是到达null则从头开始再走
          cur = cur.next ? cur.next : head;
          i++
        }
        while(cur.next != null){ // 一块儿前进
          cur = cur.next;
          pre = pre.next;
        }
        
        cur.next = head;  // 5 -> 1 -> 2 // 这个时候已经成环了 
        let res = pre.next; // 4 -> 5 -> 1 ->..... -> 3 ->(从这里断开) 4
        pre.next = null;
        return res;

};

2.成环法

思路:

  1. 计算链表长度,求出要移动的距离k
  2. 首尾成环,建立一个指针p,p移动k个长度
  3. 在p指针处断开环。
let rotateRight = function(head, k) {
    if (!head) return null;
    let p = head;
    let length = 1;
    while (p.next != null) { // 算出链表长度
        p = p.next;
        length++;
    } 
    k = length - (k % length); // 处理要移动的距离
    p.next = head; // 首尾相接
    while (k) {
        p = p.next;
        k--;
    };
    let res = p.next;  // 断开环
    p.next = null;  
    return res;
};

结合个人分析你是否是对这道题有了更清晰的认识了呢?

以上就是个人思路以及解法了,但愿你们喜欢我画的图解,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)

相关文章
相关标签/搜索