zoukankan      html  css  js  c++  java
  • [LeetCode题解]19. 删除链表的倒数第N个节点 | 双指针 + 一次遍历

    解题思路

    双指针:第一个指针先走 n 步,然后两个指针同时走。

    这里要注意当链表长度<=n,要删除头节点。

    代码

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     public int val;
     *     public ListNode next;
     *     public ListNode(int val=0, ListNode next=null) {
     *         this.val = val;
     *         this.next = next;
     *     }
     * }
     */
    public class Solution {
        public ListNode RemoveNthFromEnd(ListNode head, int n) {
            // 双指针:第一个指针先走 n 步,然后两个指针同时走
            if(head == null) {
                return head;
            }
    
            ListNode p = head;
            for(int i = 1; i <= n; i++) {
                if(p == null) {
                    break;
                }
                p = p.next;
            }
    
            if(p == null) { // 不足够或刚好 n 个节点,删除头节点 
                return head.next;
            }
    
            // 第二步:两个指针同时走,直到走到最后
            ListNode q = head, pre = null;
            while(p != null) {
                p = p.next;
                pre = q;
                q = q.next;
            }
    
            pre.next = q.next;
    
            return head;
        }
    }
    

    复杂度分析

    • 时间复杂度:(O(n)),其中 (n) 是链表的长度。一次遍历,时间复杂度为 (O(n))
    • 空间复杂度:(O(1))
  • 相关阅读:
    LeetCode 101. 对称二叉树
    PTA 两个有序序列的中位数(25分)
    CF1567
    亚线性筛
    LowbitMatrix(线段树)
    Matrix(组合数学)
    [模版] 数论基础模版
    Gym102001
    Gym102483A
    [模版] Miller-Rabin素性测试&Pollard-Rho分解质因数
  • 原文地址:https://www.cnblogs.com/liang24/p/14013393.html
Copyright © 2011-2022 走看看