【LeetCode刷题】删除链表的倒数第 N 个结点


题目链接:删除链表的倒数第 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]

解题

读完题目首先想到得方法是两次遍历,第一次取得长度,第二次遍历到到数第$n$个节点的前一个节点,删除第$n$个节点。

/**
 * 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) {
        int l = 0, j = 0;
        ListNode p = head;
        while(p != null) {
            p = p.next;
            l++;
        }

        if(l == 1) return null;
        if(l == n) return head.next;

        p = head;
        while(j < l - n - 1) {
            p = p.next;
            j++;
        }
        p.next = p.next.next;  // 直接跳过被删除节点,实际开发记得要释放删除的节点,防止内存泄漏

        return head;

    }
}

时间复杂度:$O(2n-k)$,$k$表示倒数第$k$个元素

声明:迟於|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 【LeetCode刷题】删除链表的倒数第 N 个结点


栖迟於一丘