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

思路:双指针,搞定。

注意:需要判断几种特殊情况,主要考察细节。详见代码。

    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head==null) return null;
        //三个指针,因为涉及删除操作
        ListNode pointer0=head,pointer1=head,pointer2=head;
        int index=n;

        //pointer2先行n步
        while(index-->0&&pointer2!=null) pointer2=pointer2.next;
        //如果链表长度都没有n,直接返回null,但是根据题意应该不会出现这种情况。
        if(index>=0) return null;
        
        if(pointer2==null){
            //链表长度恰好为n,需要删除的是头结点,特殊处理
            pointer1=pointer0.next;
            pointer0.next=null;
            return pointer1;
        }
        else{
            //pointer1需要移动到pointer0的下一个,pointer0才能构成pointer1的父节点关系
            pointer1=pointer1.next;
            pointer2=pointer2.next;
        }

        while(pointer2!=null){
            //三个指针同时移动,直到末尾
            pointer0=pointer0.next;
            pointer1=pointer1.next;
            pointer2=pointer2.next;
        }
        //删除pointer1节点
        pointer0.next=pointer1.next;

        return head;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值