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:

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

相关推荐
PAK向日葵4 小时前
【算法导论】PDD 0817笔试题题解
算法·面试
地平线开发者7 小时前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
地平线开发者7 小时前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
星星火柴9368 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑9 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
C++、Java和Python的菜鸟10 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀10 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散11210 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧11 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
myzzb11 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa