LeetCode 0019 Remove Nth Node From End of List

原题传送门

1. 题目描述

2. Solution 1

1、思路分析
以 n = 2
dummy: 0 | 1 2 3 4 5 为例
s f
a、删除结点必定要先找到 待删除结点的前驱;
设待删除结点为p,其前驱为pre,通用删除操作: pre->next = p->next; 或 pre->next = pre->next->next;
b、本例中待删除的结点为倒数第n个结点,则其前驱结点为倒数第(n+1)个结点;
c、使用快慢指针,快指针先走n步,意图人为造一个n+1的区间 => 同步移动后,当快指针到链表尾时,慢指针在倒数第(n+1)位置;
d、结合c、与b、,搞定收工。

2、代码实现

package Q0099.Q0019RemoveNthNodeFromEndOfList;

import DataStructure.ListNode;

/*
    以 n = 2
    dummy: 0 | 1 2 3 4 5   为例
           s   f
    1、删除结点必定要先找到 待删除结点的前驱;
       设待删除结点为p,其前驱为pre,通用删除操作: pre->next = p->next; 或 pre->next = pre->next->next;
    2、本例中待删除的结点为倒数第n个结点,则其前驱结点为倒数第(n+1)个结点;
    3、使用快慢指针,快指针先走n步,意图人为造一个n+1的区间 => 同步移动后,当快指针到链表尾时,慢指针在倒数第(n+1)位置;
    4、结合3、与1、,搞定收工。
  */
public class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 挂头结点的原因,若不挂,当n=1时,second.next 之后不会再有 next
        ListNode dummy = new ListNode(0, head);
        ListNode first = dummy.next, second = dummy;
        // first 先走n步
        for (int i = 0; i < n; i++) first = first.next;
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        return dummy.next;
    }
}

3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...