当前位置:   article > 正文

19.删除链表的倒数第N个结点_删除链表倒数第n个结点

删除链表倒数第n个结点

难度:中等

目录

一、问题描述

二、思路

1、解题思路

2、极端情况判断

3、解决极端情况

三、解题

1、代码实现

 2、时间复杂度 and 空间复杂度

四、总结


一、问题描述

这里直接采用的是LeetCode上面的问题描述。

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

下面给出示例:

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

二、思路

1、解题思路

        我们要想在链表中删除一个结点,目的就是要找到这个结点的前面一个节点(记为 left )。这里通过遍历链表 head 来计算链表的长度 ListSize ,然后通过 ListSize - n 来确定 结点 left 是链表中的第几个结点。通过 for循环遍历到 结点left 上,然后将要删除的结点的 next域 赋给 结点leftnext域 即可。

2、极端情况判断

  1. 当 链表长度 ListSize == n 时,也就是删除第一个结点。
  2. 当 链表长度 ListSize < 2 时,也就是只有一个结点。

3、解决极端情况

  1. 直接 返回指针 head->next 即可。
  2. 由于 1 <= n <= ListSize ,所以当 ListSize == 1 时,直接返回 NULL

三、解题

1、代码实现

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* removeNthFromEnd(ListNode* head, int n) {
  14. int ListSize = 0;
  15. ListNode *p = head;
  16. while(p){
  17. p = p->next;
  18. ListSize++;
  19. }
  20. delete(p);
  21. if(ListSize < 2){
  22. return NULL;
  23. }
  24. if(ListSize == n){
  25. return head->next;
  26. }
  27. ListNode * ans = head;
  28. for(int i = 1;i < ListSize-n;i++){
  29. head = head->next;
  30. }
  31. head->next = head->next->next;
  32. return ans;
  33. }
  34. };

 2、时间复杂度 and 空间复杂度

时间复杂度:O(n) ,n 为链表长度。

空间复杂度:O(1)

四、总结

        这题没有什么好说的,看清楚提示,注意细节,就可以了。

        如果对你有什么帮助,请star ♥ 一下,收藏一下,蟹蟹啦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/990694
推荐阅读
相关标签