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

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

时间:2022-11-08 23:24:51浏览次数:63  
标签:head ListNode val 19 next 链表 int 倒数第

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

解法一:先算长度,再用长度减去n即为要删除的节点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int length = 0;
        ListNode dummy = new ListNode(-1, head);
        ListNode pre = dummy;
        
        while (head != null) {
            length++;
            head = head.next;
        }

        for (int i = 0; i < length - n;i++) {
            pre = pre.next;
        }

        pre.next = pre.next.next;
        return dummy.next;
    }
}

 解法二:双指针,先让快指针比慢指针快n步,然后共同以相同速度移动,当快指针移动至最后一个节点时,慢指针所指向的即为倒数第n个节点

public ListNode removeNthFromEnd(ListNode head, int n){
    ListNode dummyNode = new ListNode(0);
    dummyNode.next = head;

    ListNode fastIndex = dummyNode;
    ListNode slowIndex = dummyNode;

    //只要快慢指针相差 n 个结点即可
    for (int i = 0; i < n  ; i++){
        fastIndex = fastIndex.next;
    }

    while (fastIndex.next != null){
        fastIndex = fastIndex.next;
        slowIndex = slowIndex.next;
    }

    //此时 slowIndex 的位置就是待删除元素的前一个位置。
    //具体情况可自己画一个链表长度为 3 的图来模拟代码来理解
    slowIndex.next = slowIndex.next.next;
    return dummyNode.next;
}

 

标签:head,ListNode,val,19,next,链表,int,倒数第
From: https://www.cnblogs.com/fulaien/p/16871632.html

相关文章

  • Computer Vision_33_SIFT:Object recognition from local scale-invariant features—
    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面。对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多......
  • 洛谷-1198
    洛谷-1198思路这个!辅助解释Code#include<bits/stdc++.h>usingnamespacestd;#define_u_u_ios::sync_with_stdio(false),cin.tie(nullptr)#definecfint_o_o......
  • MFC学习笔记——07-MFC_19day
    在学习MFC总结了笔记,并分享出来。07-MFC_19day  一、基于对话框编程 (1)基于对话框编程对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在Vis......
  • leetcode-819-easy
    MostCommonWordGivenastringparagraphandastringarrayofthebannedwordsbanned,returnthemostfrequentwordthatisnotbanned.Itisguaranteedthe......
  • 206. 反转链表
    206.反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例......
  • 20220927 19. 开机流程、模块管理与 Loader
    19.1Linux的开机流程分析19.1.1开机流程一览系统开机的经过可以汇整成下面的流程的:载入BIOS的硬件信息与进行自我测试,并依据设置取得第一个可开机的设备;读取......
  • 203. 移除链表元素
    203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,......
  • 链表简单实现
    #include<stdlib.h>#include<stdio.h>#include<stdbool.h>#include<time.h>/*该链表不带头节点第一个节点下标从0开始*/#defineElementTypeint#defineERRO......
  • 算法-26反转部分单向链表
    描述给定一个单链表,在链表中把第 L 个节点到第R个节点这一部分进行反转。输入描述:n表示单链表的长度。val表示单链表各个节点的值。L表示翻转区间的左端点。R表......
  • 【前端面试题】—19道有关前端测试的面试题(附答案)
    虽然工作中有专门的测试人员(QA工程师)帮我们实现对代码的测试,但是为保证开发的代码质量,我们还是要进行单测、自测。测试部分的面试题主要考察应试者对前端测试的了解,主要涉及......