这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
之前写了JavaScript链表刷题,JavaScript链表刷题(二),JavaScript链表刷题(三)
有兴趣的童鞋可以冲,接下来继续刷两道链表题~~
一、旋转链表
61. 旋转链表
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
- 输入:head = [1,2,3,4,5], k = 2
- 输出:[4,5,1,2,3]
示例 2:
- 输入:head = [0,1,2], k = 4
- 输出:[2,0,1]
提示:
- 链表中节点的数目在范围 [0, 500] 内
- -100 <= Node.val <= 100
- 0 <= k <= 2 * 109
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ro… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
将链表尾部与头部连起来形成环,再找到对应的移动后的位置断开链表,返回新链表。
移动后的位置为 size - k % size
代码实现
/**
* 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) return null;
// 获取链表的长度,并将尾部与头部连起来形成环
let size = 1, cur = head;
while(cur.next) {
cur = cur.next;
size ++;
}
cur.next = head;
// 将对应的位置断开,返回新链表
for(let i = 1; i < size-k%size; i ++) {
head = head.next;
}
let newHead = head.next;
head.next = null;
return newHead;
};
二、删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
- 输入:head = [1,2,3,4,5], n = 2
- 输出:[1,2,3,5]
示例 2:
- 输入:head = [1], n = 1
- 输出:[]
示例 3:
- 输入:head = [1,2], n = 1
- 输出:[1]
提示:
- 链表中结点的数目为 sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
设置两个指针pre、cur,cur指针先往前走n个节点,然后两个指针同时走,当cur走到链表尾时,pre指针刚好指向要删除的节点的前一个节点,然后将pre.next指向pre.next.next便删除了第n个节点。
代码实现
/**
* 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} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
if(!head) return null;
let ret = new ListNode(-1, head);
let pre = ret;
let cur = head;
// cur比pre先走n个指针,当cur走到链表尾时,pre刚好指向倒数第n个节点的前一个
//(题目中1 <= n <= size,所以不用考虑n > size的情况)
while(n --) {
cur = cur.next;
}
while(cur) {
pre = pre.next;
cur = cur.next;
}
pre.next = pre.next.next;
return ret.next;
};
系列文章
以下是JavaScript链表刷题的系列文章, 有兴趣的童鞋可以冲~~