「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
兄弟们!偶是大熊。。。
今天带大家看看 旋转链表这道题,看题
输入: 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,这也是一种思路。。。 加油,兄弟们!