【链表】 LEETCODE19 删除倒数第n个节点

//第一种解法,遍历一次数长度,然后把头尾相连,再遍历一次
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* tem=head;
        int len=0;
        while(tem->next){    //这里得到的长度是真实长度-1
            tem=tem->next;
            len++;
        }
        if(len==0) return NULL;
        if(len==1){
            if(n==1){
                head->next=NULL;
            }
            else head=head->next;
            return head;
        }
        tem->next=head;     //头尾相连
        ListNode* tail=tem;
        for( int i=0;i<len-n+1;i++){    //从最后一个节点出发,直到到达要删的节点的前一个;但如果要删的节点是表头,也不会移动
            tem=tem->next;
        }
        ListNode* trash=tem->next;   //要删的节点
        tail->next=NULL;                   //如果要删的是最后一个,如果没有这句会把倒数第二个和头连成环
        tem->next=trash->next;
        if(trash==head) head=head->next;
        tail->next=NULL;
        return head;

    }
};

  

//上面一种分类非常麻烦,而且其实就是两个pass,完全没必要
//避免麻烦的分类和涉及头尾的特殊情况,很好用的方法是链表头加一个空的node

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy= new ListNode(0);
        dummy->next=head;
        ListNode* r=head;
        int len=0;
        while(r){
            r=r->next;
            len++;
        }
        r=dummy;
        for(int i=0; i<len-n; i++){
            r=r->next;
        }
        r->next=r->next->next;
        return dummy->next;

    }
};

  

//解法3, 用两个指针做遍历,第一个比第二个快n个节点,等第一个到达tail的时候,第二个就是要删的节点前一个。
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy=new ListNode(0);
        dummy->next=head;
        ListNode *f=dummy, *s=dummy;
        for(int i=0;i<n;i++){
            f=f->next;
        }
        while(f->next){
            f=f->next;
            s=s->next;
        }
        s->next=s->next->next;
        return dummy->next;
    }
};

  

原文地址:https://www.cnblogs.com/rarecu/p/11520482.html

时间: 2024-10-26 20:47:12

【链表】 LEETCODE19 删除倒数第n个节点的相关文章

链表问题----删除倒数第K个节点

在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基本思路: 让链表从头开始走到尾,每移动一步,就让k值减一,当k 值走到结尾时, 如果k 值大于0,说明链表根本没有倒数第k 个节点 如果等于0,那么头节点就是倒数第k 个节点,此时应该返回 head.next 如果小于0,则重新从头节点开始,每移动一步,k 值增加一,当k 等于0时,移动停止,移动到

算法总结之 在单链表和双链表中删除倒数第k个节点

分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 当链表走到头时候 如果k值大于0   说明不用调整  因为链表根本没有倒数第k个节点 此时将原链表直接返回即可 如果k值=0,说明链表倒数第k个节点就是头节点,此时直接返回head.next 也就是原链表的第二个节点 让第二个节点作为链表的头节点,此时直接返回head.next 如果k值<0  重新从

链表中删除倒数第K个节点

问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如果链表为空或者K<0时,直接返回:如若不然,遍历链表的每个节点,每经过一个节点K减1.比如对于1 --> 2 --> 3 --> 4该链表的过程如下: K = 5,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4 4,3,2,1: K = 4,所遍

2.2 在单链表和双链表中删除倒数第K个节点

题目:分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点 要求:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1) My: 删除单链表或双链表中倒数第K个节点,核心代码(单链表和双链表的方法定义参见另一篇文:https://www.cnblogs.com/latup/p/9823179.html): 1 def del_k(L, k): 2 index = L.length - k + 1 3 L.delt(index) 原文地址:htt

[算法]在单链表和双链表中删除倒数第k个结点

题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头走到尾,每移动一步,就让K值减一,当链表走到结尾时,如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时将原链表直接返回即可:如果K值等于0,说明链表倒数第K个节点就是头结点,此时直接返回head.next,相当于删除了头结点.当K的值小于零时,再次从头结点开始走,每移动一步,就让

leetCode 19.Remove Nth Node From End of List(删除倒数第n个节点) 解题思路和方法

Remove Nth Node From End of List Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes

19. Remove Nth Node From End of List 删除倒数第n各节点

Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5. Note:Given n

leetcode链表--18、remove-nth-node-from-end-of-list(从链表中删除倒数第k个结点)

题目描述 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2.   After removing the second node from the end, the linked list becomes 1->2->3->5. Note:

查找和删除倒数第n个节点的问题

1 class ListNode 2 { 3 int val; 4 ListNode next; 5 ListNode(int x) 6 { 7 val = x; 8 } 9 } 10 public class NthNodeFromEnd { 11 public ListNode removeNthFromEnd(ListNode head, int n) 12 { 13 ListNode p = head; 14 ListNode q = head; 15 for(int i = 0; i