精选力扣500题 第53题 LeetCode 19. 删除链表的倒数第 N 个结点c++/java详细题解

Posted 林深时不见鹿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第53题 LeetCode 19. 删除链表的倒数第 N 个结点c++/java详细题解相关的知识,希望对你有一定的参考价值。

1、题目

给你一个链表,删除链表的倒数第 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

2、思路

(两次遍历) O ( n ) O(n) O(n)

定义虚拟头节点节点,并指向链表头节点。我们从虚拟头结点开始遍历,得到链表的长度n。如果我们想要将倒数第k个结点删除,可以首先要找到倒数第k+1个结点p,然后将p->next = p->next->next。而链表中的倒数第 k+1个节点,对应链表中的正数第n-k个节点。因此可以再从虚拟头节点开始遍历链表,将正数第n-k+1个节点删除即可。

图示过程如下:

  • 1、定义虚拟头节点节点,指向链表头节点。

  • 2、从虚拟头结点dummy开始遍历,得到链表的长度n

  • 3、如果要将倒数第k个结点删除,我们首先找到倒数第k+1个结点p,对应正数的第 n-k个结点。

  • 4、让p->next = p->next->next,将其删除。

  • 5、最后返回虚拟头结点的的下一个结点dummy->next

时间复杂度分析: O ( n ) O(n) O(n),其中 n 是链表的长度。

空间复杂度: O ( 1 ) O(1) O(1)

3、c++代码

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int k) {
    auto dummy = new ListNode(-1);   //虚拟头结点
    dummy->next = head;  //让虚拟头结点指向真正的头结点
    int n=0;
    for(auto p = dummy;p;p = p->next)  n++;  //计算结点的个数,便于找到倒数第k+1个结点
    auto p = dummy;
    for(int i = 1; i <= n-k-1;i++) p = p->next;
    p->next = p->next->next;
    return dummy->next;
  }
};

4、java代码

/**
 * 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 k) {
        ListNode dummy =new ListNode(-1);   //虚拟头结点
        dummy.next=head; 
        int n = 0;
        for(ListNode p = dummy; p != null ;p = p.next)  n++;
        ListNode p = dummy;
        for(int i = 1;i <= n-k-1;i++) p = p.next;
        p.next = p.next.next;
        return dummy.next;
    }   
}

原题链接: 19. 删除链表的倒数第 N 个结点
在这里插入图片描述

以上是关于精选力扣500题 第53题 LeetCode 19. 删除链表的倒数第 N 个结点c++/java详细题解的主要内容,如果未能解决你的问题,请参考以下文章

精选力扣500题 第19题 LeetCode 199. 二叉树的右视图c++详细题解

精选力扣500题 第20题 LeetCode 704. 二分查找c++详细题解

精选力扣500题 第8题 LeetCode 160. 相交链表 c++详细题解

精选力扣500题 第61题 LeetCode 78. 子集c++/java详细题解

精选力扣500题 第6题 LeetCode 912. 排序数组c++详细题解

精选力扣500题 第21题 LeetCode 42. 接雨水c++详细题解