首页 > 其他分享 >Leetcode19. 删除链表的倒数第 N 个结点

Leetcode19. 删除链表的倒数第 N 个结点

时间:2023-03-30 23:01:52浏览次数:40  
标签:head ListNode val int nullptr next 链表 Leetcode19 倒数第

 

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

自己纯手写第一题,递归有点冗杂,开辟了虚拟头节点,而且要特别注意边界条件(当倒数第n个正好是头节点时)。

**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int recursion(ListNode* node,ListNode* &head, int n){
        if(node->next == nullptr){
            int cnt = 0;
            return cnt;
        }
        int cnt = recursion(node->next, head, n);
        cnt ++;
        if(cnt == n){
            if(node->next == head){
                head = head->next;
            }
            else{
                node->next = node->next->next;
            }
        }  
        return cnt;
    }

    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *node = new ListNode(-1);
        node->next = head;
        recursion(node, head, n);
        return head;
    }
};

大佬的代码永远是那么简洁利落

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int cur = 0;
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head == nullptr) return nullptr;
        head->next = removeNthFromEnd(head->next, n);
        cur ++;
        if(cur == n) return head->next;
        return head;
    }
};

大佬的时间0ms,我的递归4ms,但是我没看出来是由于哪个原因导致时间花费是数倍,感谢如果有好心大佬在评论区能指导一下。

最经典的解法莫过于双指针了。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int i = 0;
        ListNode* first = head;
        ListNode* slow = head;
        while(i ++ < n){
            first = first->next;//快指针先走n步
        }
        if(first == nullptr){
            return head->next;
        }

        while(first->next != nullptr){
            first = first->next;
            slow = slow->next;
        }
        slow->next = slow->next->next;
        return head;
    }
};

 

标签:head,ListNode,val,int,nullptr,next,链表,Leetcode19,倒数第
From: https://www.cnblogs.com/luxiayuai/p/17274690.html

相关文章

  • 两个链表相加,翻转链表
    将两个链表进行翻转,然后遍历链表进行相加翻转链表:reverseList(head){pre=null;//将遍历到的节点放在这个空节点的前面cur=head;while(cur!=null){temp =......
  • HJ48_从单向链表中删除指定值的节点_单向链表
    自定义类型链表:用链表的方式实现链表的生成、插入和删除。思路:需要两个class,一个为node,用与生成节点,一个为linklist,用于定义节点操作以及初始化head头节点。因为单向链......
  • 删除链表的第N个节点|栈、双指针
    删除链表的倒数第N个节点类似于删除链表中的第N个节点,但是这里是倒数第N个且不知道链表的长度,如果用删除第N个节点的方法去解决问题的时候需要先知道链表的长度。这就需......
  • 两两交换链表中的节点|递归
    两两交换链表中的节点链表中每两两相邻的节点将其对调位置,涉及的主要操作位交换节。但需要注意初始位置的交换即返回值,以及奇数个节点的处理方法,这里给出两种方法,迭代和......
  • 环形链表|哈希、快慢指针
    环形链表判断一个链表中是否有环,如果有返回环的起始位置。难点有两个,一是判断是否有环,二是找到起始点。这里有两种方法,一种是哈希集,另一种是快慢指针。对应题目142.环......
  • 反转链表|递归
    反转链表将链表反转过来,可以对比反转数组,但是链表由于不知道链表大小所以反转数组的方法在这里会变得复杂。这里有两种方法,双指针和递归法。对应题目206.反转链表......
  • 双循环链表 by lyx
    #include<iostream>usingnamespacestd;template<classT>structDblNode{  Tdata;  DblNode<T>*lLink,*rLink;  DblNode(DblNode<T>*l=NULL,DblNod......
  • 链表的遍历
    练习1:一组整数已存放在带头结点的单链表中,设计算法,求结点值小于结点平均值的结点个数,并通过函数值返回结果。 #include<stdio.h>#include<stdlib.h>typedefstructnode{......
  • 数据结构-->单链表OJ题--->讲解_05
    本期我们讲解:>1.给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前本题的思路是创建两个链表,通过比较,一个存放小于x的结点的链表,另一个存放大于......
  • 数据结构-->单链表OJ题--->讲解_04
    本期我们讲解一道:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表所有结点组成的。现附上图示样例:现在上手代码:>SLTNode*CombineLists(S......