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:

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

相关推荐
杰克尼7 分钟前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
YuTaoShao1 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
二进制person5 小时前
Java SE--方法的使用
java·开发语言·算法
OneQ6666 小时前
C++讲解---创建日期类
开发语言·c++·算法
JoJo_Way6 小时前
LeetCode三数之和-js题解
javascript·算法·leetcode
.30-06Springfield6 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
凌肖战8 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
weixin_478689768 小时前
十大排序算法汇总
java·算法·排序算法
luofeiju9 小时前
使用LU分解求解线性方程组
线性代数·算法
SKYDROID云卓小助手9 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理