[61] 旋转链表
1.[6] N 字形变换2.[7] 整数反转3.[5] 最长回文子串4.[4] 寻找两个正序数组的中位数5.[3] 无重复字符的最长子串6.[2] 两数相加7.[1] 两数之和8.[8] 字符串转换整数 (atoi)9.[9] 回文数10.[10] 正则表达式匹配11.[11] 盛最多水的容器12.[12] 整数转罗马数字13.[13] 罗马数字转整数14.[14] 最长公共前缀15.[15] 三数之和16.[16] 最接近的三数之和17.[17] 电话号码的字母组合18.[18] 四数之和19.[19] 删除链表的倒数第 N 个结点20.[20] 有效的括号21.[21] 合并两个有序链表22.[22] 括号生成23.[23] 合并 K 个升序链表24.[24] 两两交换链表中的节点25.[25] K 个一组翻转链表26.[26] 删除有序数组中的重复项27.[27] 移除元素28.[28] 找出字符串中第一个匹配项的下标29.[29] 两数相除30.[30] 串联所有单词的子串31.[31] 下一个排列32.[32] 最长有效括号33.[33] 搜索旋转排序数组34.[34] 在排序数组中查找元素的第一个和最后一个位置35.[35] 搜索插入位置36.[36] 有效的数独37.[37] 解数独38.[38] 外观数列39.[39] 组合总和40.[40] 组合总和 II41.[41] 缺失的第一个正数42.[42] 接雨水43.[43] 字符串相乘44.[44] 通配符匹配45.[45] 跳跃游戏 II46.[46] 全排列47.[47] 全排列 II48.[48] 旋转图像49.[49] 字母异位词分组50.[50] Pow(x, n)51.[51] N 皇后52.[52] N 皇后 II53.[53] 最大子数组和54.[54] 螺旋矩阵55.[55] 跳跃游戏56.[56] 合并区间57.[57] 插入区间58.[58] 最后一个单词的长度59.[59] 螺旋矩阵 II60.[60] 排列序列
61.[61] 旋转链表
62.[62] 不同路径63.[63] 不同路径 II64.[64] 最小路径和65.[65] 有效数字66.[66] 加一67.[67] 二进制求和68.[68] 文本左右对齐69.[69] x 的平方根70.[70] 爬楼梯71.[71] 简化路径72.[72] 编辑距离73.[73] 矩阵置零74.[74] 搜索二维矩阵75.[75] 颜色分类76.[76] 最小覆盖子串77.[77] 组合78.[78] 子集79.[79] 单词搜索80.[80] 删除有序数组中的重复项 II1 /** 2 * Definition for singly-linked list. 3 * function ListNode(val, next) { 4 * this.val = (val===undefined ? 0 : val) 5 * this.next = (next===undefined ? null : next) 6 * } 7 */ 8 /** 9 * @param {ListNode} head 10 * @param {number} k 11 * @return {ListNode} 12 */ 13 var rotateRight = function (head, k) { 14 // 链表为空 || 链表只有一个节点 || 旋转数量为0 15 if (!head || !head.next || k === 0) { 16 return head; 17 } 18 // 使用一个指针,统计链表长度 19 let node = head; 20 // 统计节点数量,指针初始指向头结点,因此初始值为1 21 let length = 1; 22 23 // 不断移动指针,但它停在尾结点时,完成链表长度的统计 24 while (node.next) { 25 node = node.next; 26 length++; 27 } 28 let rotate = k % length; // 链表旋转节点数量,k可能大于链表长度,因此需要取余 29 30 // 如果rotate为0,无需旋转,直接返回即可 31 if (rotate === 0) { 32 return head; 33 } 34 35 // 将尾结点与头结点连接,让链表形成环 36 node.next = head; 37 let breakNode = head; // 使用指针,最终会指向断点位置 38 let breakPoint = length - rotate - 1; // 将指针移动到断点位置所需次数 39 40 // 将指针移动到断点位置 41 while (--breakPoint >= 0) { 42 breakNode = breakNode.next; 43 } 44 45 // 链表的新头结点,就在断点位置的下一个节点 46 const newHead = breakNode.next; 47 // 将链表的环打断 48 breakNode.next = null; 49 50 // 返回新链表 51 return newHead; 52 };