首页 > 其他分享 >19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点

时间:2023-03-18 16:24:01浏览次数:45  
标签:结点 slow ListNode 19 fast next 链表 dummyHead 倒数第

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
解题思路

双指针的一个使用

  • 设置虚拟头结点,主要目的是方便删除操作

    ListNode* dummyHead = new ListNode();

  • 使用快慢指针方法,定义两个指针,让两个指针都指向虚拟头结点

    ListNode* fast = dummyHead

    ListNode* slow = dummyHead

  • 让fast指针移动n+1步,只有这样同时移动的时候slow才能指向删除结点的上一个结点,比较想不出来

    while (n-- && fast != NULL) {

    ​ fast = fast->next;

    }

    fast = fast->next;

  • fast slow 同时移动,直到fast指向末尾

  • 删除slow指向的下一个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 快慢指针
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* fast = dummyHead;
        ListNode* slow = dummyHead;
        while (n-- && fast != NULL) {
            fast = fast->next;
        }
        fast = fast->next; // 多走一步
        while (fast != NULL) {
            fast = fast->next;
            slow = slow->next;
        }
        
        slow->next = slow->next->next;

        return dummyHead->next;
    }
};

标签:结点,slow,ListNode,19,fast,next,链表,dummyHead,倒数第
From: https://www.cnblogs.com/luketebo/p/17231029.html

相关文章

  • 24.两两交换链表中的结点
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入......
  • 142.环形链表plus
    142.环形链表II给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链......
  • 面试题 02.07链表相交
    面试题02.07.链表相交给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开......
  • 双链表
    双链表双链表有两个指针,一个指向前一个指向后,数组模拟链表实现思想双链表有两个指针,一个指向前一个指向后,故定义三个数组\(l[N],r[N],val[N]\)\(l[N]指向的是当前......
  • day19
    day19释放资源的方式close()try-catch-finallyfinally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。作用:一般用于......
  • 力扣 142 环形链表
    判断一个链表有无环,并且如果有环指出入环的位置。1、判断有无环是通过一快一慢指针来判断的。快的指针走每次走两步、慢的指针每次走一步,这样如果没有环的话他俩不会相遇......
  • 数据结构-->链表_01
    首次书写链表有关的知识,先来明确什么是链表?链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的举一个形象化的现实生活中......
  • 【链表】复习/刷题 记录
    leetcode203.RemoveLinkedListElements/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode......
  • day3 | 203. 移除链表元素,206. 反转链表,707. 设计链表
    203.移除链表元素 题目描述 给你一个链表的头节点head和一个整数val,删除链表中的那些存储的值为val的节点,并且返回新的头节点。 思路: 1.创建一个虚拟头节点,......
  • 力扣---24. 两两交换链表中的节点
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,......