LeetCode 旋转链表

137 阅读2分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

兄弟们!偶是大熊。。。

今天带大家看看 旋转链表这道题,看题

力扣地址

image.png

输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]

然后看代码

我们来思考这道题,head移动K个位置后形成新的链表,那么k=0 或者null 或者 链表长度的倍数时候 链表相当于没有移动 我们可以直接返回链表就好了 。。。 再或者链表为空呢 或者链表的next指向null呢?也是直接返回链表就好了。。。这时候我们里清楚了第一步

接下来K如果等于2的话,相当于链表相当于,从链表最后往前数K位 ,然后截断链表,把链表最后一位指向链表的第一位,把链表截断的部分指向null,这样我们就可以拿到移动K位后的链表了

思路里清楚之后,我们来看代码,如下:

var rotateRight = function(head, k) {
    if (!head || !head.next || !k) return head; // 当head等于null   head.next=null  k=null的时候
    let len = 1, curr = head;
    while (curr.next) {
        curr = curr.next;
        len ++;//拿到链表总长度
    }
    curr.next = head; //连接成环形链表
    let move = len - (k % len);//取模计算实际移动的步数
    while (move) {
        curr = curr.next;//根据move移动指针寻找截断点
        move --;
    }
    let t = curr.next; //保存截断点之后的点t(也就是新链表的头结点)
    curr.next = null; //截断成普通链表 
    return t;//返回新链表的头结点
};

是不是很简单呢?

同理,我们也可以把链表直接翻转,K位截断位俩个链表(5->4->null和3->2->1->null), 然后把俩个链表再翻转过来,然后把链表指向改变为4->5->1->2->3->null,这也是一种思路。。。 加油,兄弟们!