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

Posted rarecu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表 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;
    
;

  

以上是关于链表 LEETCODE19 删除倒数第n个节点的主要内容,如果未能解决你的问题,请参考以下文章

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

LeetCode 19——删除链表的倒数第 N 个节点

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

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

leetcode 19 删除链表的倒数第N个节点

LeetCode19. 删除链表的倒数第N个节点