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

181 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

删除链表的倒数第 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

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

Related Topics

  • 链表
  • 双指针

题目分析

这道题同样也是考察快慢指针,

代码实现

这是代码的实现:

/**
 * 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) {
        ListNode end = new ListNode(0,head);
        ListNode first = head;
        ListNode second = end;
        for (int i=0;i<n;++i) {
            first = first.next;
        }
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        ListNode ans = end.next;
        return ans;
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉快慢指针的使用和操作。

这道题目和上道题目差不多,同样是考察快慢指针,我们根据n先让快指针多走n步,然后再一块走,当快指针走到尾部的时候,慢指针就正好处在第n个节点的位置,这样跳过这个这个节点,就把第n个节点删除了。

小知识

关于

springBean的生命周期众说纷纭,那么给出我的版本:

先是解析类得到BeanDefinition,如果有多个构造方法就要进行推断构造方法,确定好构造方法后进行实例化得到一个对象,然后对对象中有@Autowired注解的类进行属性填充,然后回调Aware方法,然后是调用BeanPostProcessor的初始化前的方法,然后调用初始化方法,在进行调用BeanPostProcessor的初始化后的方法,进行AOP,bean如果是单例的就放入单例池中,使用Bean,最后Spring关闭容器的时候调用DisposableBean的destory()进行摧毁

总结

本篇文章主要解决了一个删除链表的倒数第 N 个结点的问题,然后简单说了一下spring的生命周期这个面试高频题目,这道题除了使用快慢指针,也可以先计算出链表的长度再遍历,还可以使用栈,希望感兴趣的小伙伴们自己实现一下吧,嘿嘿,多动脑,勤思考。