JavaScript链表刷题(四)

143 阅读1分钟

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

之前写了JavaScript链表刷题JavaScript链表刷题(二)JavaScript链表刷题(三)

有兴趣的童鞋可以冲,接下来继续刷两道链表题~~

一、旋转链表

61. 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

image.png

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

示例 2:

image.png

  • 输入: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:

image.png

  • 输入: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链表刷题的系列文章, 有兴趣的童鞋可以冲~~

JavaScript链表刷题

JavaScript链表刷题(二)

JavaScript链表刷题(三)

JavaScript链表刷题(四)

JavaScript链表刷题(五)