[leetcode]Remove Nth Node From End of List

本文介绍了一种使用双指针技术从链表中删除倒数第N个节点的方法。通过让一个指针先向前移动N步,然后与另一个指针同步移动直至首个指针到达链表尾部,此时第二个指针正好位于待删除节点的前一个位置。

代码写的很挫,交了挺多次。以后写代码  一定要先把左右的情况 都考虑清楚  再考虑敲代码。哎

public ListNode removeNthFromEnd(ListNode head, int n) {

        ListNode thead=head,nhead=head;
        if(head==null)
            return head;
            
        int i=0;
        while(head.next!=null){
            head=head.next;
            i++;
            if(i>n)
                nhead=nhead.next;
        }
        if(i==0)//判断就一个节点的情况
           return null;
        else if(n==1)//判断移除最后一个节点的情况
            nhead.next=null;
        else if(i==n-1)//判断移除第一个节点的情况
             return nhead.next;
        else
            nhead.next=nhead.next.next;
        return thead;

    }


别人的文章:

思路:

两个指针,p先走n步,然后q开始走。当p走到末尾时,q正好到了待删除节点。

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. struct LinkNode  
  4. {  
  5.     int data;  
  6.     LinkNode *next;  
  7.     LinkNode(int x):data(x),next(NULL){}  
  8. };  
  9.   
  10. LinkNode * removeNthNodeFromEnd(LinkNode *head,int n)  
  11. {  
  12.     if(head == NULL || n == 0)//防御性编程,增加健壮性  
  13.         return head;  
  14.     LinkNode *dummy = new LinkNode(-1);  
  15.     dummy->next = head;  
  16.     LinkNode *p,*q,*tmp;  
  17.     p = dummy;  
  18.     q = dummy;  
  19.       
  20.     //p先走n步  
  21.     for(int i=0;i<n;i++)  
  22.     {  
  23.         if(p->next != NULL)  
  24.             p = p->next;  
  25.         else  
  26.             return head;//如果n超过链表的长度,直接返回head  
  27.     }  
  28.   
  29.     //然后p,q一起走  
  30.     while(p->next)  
  31.     {  
  32.         p = p->next;  
  33.         q = q->next;  
  34.     }  
  35.   
  36.     //此时q指向的是待删除节点的前驱  
  37.     tmp = q->next->next;  
  38.     delete q->next;  
  39.     q->next = tmp;  
  40.   
  41.     head = dummy->next;  
  42.     delete dummy;  
  43.     return head;  
  44. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值