旋转链表
题目描述:
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
提示:
- 链表中节点的数目在范围
[0, 500]内 -100 <= Node.val <= 1000 <= k <= 2 * 109
解题思路:
k并没有规定小于或等于链表长度,因此k可以大于链表长度,实际向右移动的结果等同于n=k%len(len是链表长度)。
该题可以看成将倒数n个数移到链表最前面,倒数n+1个数指向null。
- 指针p指向倒数第n+1节点。
- 记录q为倒数n个数
- 将倒数n个数q和原链表倒数第n个节点之前的链表串连起来。因此,要记录原链表倒数第一个节点tail。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var rotateRight = function(head, k) {
if(head == null || head.next == null) return head;
// 获得链表长度len
var tail = head, len = 1;
while(tail.next != null) {//这里用tail.next来判断而不是tail,是为了记录原链表最后一个节点。
tail = tail.next;
len++;
}
var n = k%len;//实际向右移动的个数
if(n == 0) return head;
var m = len - n;
var p = head;
while(--m){
p = p.next;
}
var q = p.next;
p.next = null;
flag.next = head;
return q;
};
自述
哈哈,我太开心了,这是我学习了六个链表算法后第一个没有参考别人的解题方法,并且在1个小时内完成的算法。
算法小白一个,记录自己的算法学习之路。如果您发现问题,欢迎留言交流。