LeetCode--HOT100题(29)

目录

  • [题目描述:19. 删除链表的倒数第 N 个结点(中等)](#题目描述:19. 删除链表的倒数第 N 个结点(中等))
  • PS:

题目描述:19. 删除链表的倒数第 N 个结点(中等)

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

LeetCode做题链接:LeetCode-删除链表的倒数第 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

进阶: 你能尝试使用一趟扫描实现吗?

题目接口

java 复制代码
/**
 * 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) {

    }
}

解题思路

  • 1.本题采用双指针的思路,先让一个指针(后指针)移动到和第一个指针(前指针)相差n+1个元素(也就是中间相隔2个结点)

  • 2.然后一起移动,如果移动到后指针为null,说明前指针的下一个结点就是要删除的倒数第n个元素

  • 3.删除前指针的下一个结点即可

  • 4.最后返回head的值,因为head一直在头部

  • 5.注意:当n和链表长度一致的时候,说明要删的是第一个元素,直接返回head->next即可

注:上面的图片来自:程序员吴师兄

代码

java 复制代码
/**
 * 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) {
		if (head == null) {
            return null;
        }
        ListNode frontPointer = head;
        ListNode backPointer = head;

        while (n-- >= 0) {
            // 判断后指针是否为空,为空停止
            if (backPointer == null) {
            	// 指针为空,且n和链表长度一致,说明要删除的是第一个元素
                if (n == -1) {
                    return head.next;
                }
                return null;
            }
            backPointer = backPointer.next;
        }

        while (true) {
        	// 后指针为空的时候,停止遍历,删除前指针的后一个结点
            if (backPointer == null) {
                frontPointer.next = frontPointer.next.next;
                break;
            }
            // 两个指针遍历
            frontPointer = frontPointer.next;
            backPointer = backPointer.next;
        }
        return head;
    }
}

成功!

PS:

感谢您的阅读!如果您觉得本篇文章对您有所帮助,请给予博主一个喔~

相关推荐
算AI3 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh5 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之6 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓6 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf6 小时前
图论----拓扑排序
算法·图论
我要昵称干什么6 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ6 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl6 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦6 小时前
日期类的实现
数据结构·c++·算法
ChoSeitaku6 小时前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯