【LeetCode刷题】NO.22---第19题

127 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目

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

二、思路分析:

这道题的题目的思路与我上篇的剑指offer的题目解题思路几乎一致,上一篇的要求是让我们找出倒数第K个元素,而这一道题目则是让我们删除倒数第k个结点然后返回链表的头结点,实质上思路都是一样的,但是有一些小细节需要注意:

  • 我们需要借助哨兵节点来实现返回链表的头结点,因为如果要求删除的是第一个元素那么我们创建头结点再表头上就会导致出错
  • 返回的值就是哨兵节点指针指向的链表头

三、代码:

/**
 * 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) {
    //设置哨兵节点
    let pre =new ListNode(0);
    pre.next = head;
    let fast = pre;
    let slow = pre;
    while(n--) fast = fast.next;
    while(fast&&fast.next){
        fast = fast.next;
        slow = slow.next;
    }
    slow.next = slow.next.next;
    return pre.next;
};

四、总结:

做链表的相关题目的时候,指针移动的相关操作特别的重要,就比如这道题寻找倒数第k个数我们利用了指针寻找倒数第k个数,如果需要返回头结点的题目时,就需要有一个哨兵结点来记录相关的结点。