LeetCode19. 删除链表的倒数第 N 个结点 Java 双指针法

题目描述

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

LeetCode19. 删除链表的倒数第 N 个结点 Java 双指针法_第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

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

AC代码以及详细注释 

/* @Description: Given the head of a linked list, remove the nth node from the end of the list and return its head.
*/

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {

        ListNode pre = head;
        ListNode cur = head;

        // 前指针比后指针多走n次
        while (n-- > 0 && pre != null) {
            pre = pre.next;
        }

        // 前后指针同时遍历,直到前指针达到终点
        while (pre != null && pre.next != null) {
            pre = pre.next;
            cur = cur.next;
        }

        // pre 为 null 说明要删除的是头节点
        if (pre == null && head != null) {
            head = head.next;
        } else  // 此时cur.next就是要删除的节点
            if (cur != null && cur.next != null) {
                cur.next = cur.next.next;
            }

        return head;
    }
}

时间以及空间复杂度

  • 时间复杂度:O(n),其中 n 是链表长度。执行用时:0ms,击败 100%使用 Java 的用户

  • 空间复杂度:O(1),内存消耗:38.27MB,击败 92.46%使用 Java 的用户

你可能感兴趣的:(#,链表,LeetCode思路分享,链表,java,数据结构)