【力扣】删除链表的倒数第N个结点

这篇博客介绍了两种方法来删除链表中的倒数第N个节点:一种是通过循环找到要删除节点的前一个节点,另一种是递归实现。在循环方法中,创建一个额外的指针q指向头节点,计算链表长度并找到目标节点,然后进行删除操作。递归方法则是通过递归遍历链表,当计数达到N时,返回当前节点的下一个节点以跳过待删除节点。这两种方法都考虑了特殊情况,如链表长度为1或N等于1的情况。
摘要由CSDN通过智能技术生成

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

 

 思路:要删除倒数第N个结点,第一想到的还是循环,如果要删除结点,则需要知道一共要循环多少次,然后找到要删除的结点的上一个结点,直接就可以该结点.next = 该节点.next.next

但是题目不是直接告诉要删除第几个,而是倒数第几个,转换一下那么就是删除第(链表长度减去N+1)个结点,循环指向要删除结点的前一个结点。

新建一个结点q指向原链表的头结点,不能动,最后返回它 -> 找到要删除链表的前一节点 -> 删除     ->  返回q

当然还有特殊情况,如果是长度只有1,删除一个结点,直接返回null ;如果长度为n,倒数第n个,即删除头结点,那么直接返回q.next

public static ListNode removeNthFromEnd(ListNode head,int n){
        //先找到改元素,然后删除
        ListNode q = head;
        int l = length(head)-n+1;
        for(int i=1;i<l-1;i++){
            head = head.next;
        }
        ListNode p = head.next;
        if(length(head)==1)
            q=null;
        else if(length(head)-n==0)
            q = q.next;
        else head.next = p.next;
        return q;
    }

第二种递归:

 首先不知道要删除的是哪个元素,循环几次,设置i进行计数(即循环的次数),当i==n时,此时就是要删除的元素,直接返回它下一个元素跳过它即可。i++是回溯的时候➕,从后往前+,所以i直接和n进行比较

 //删除倒数第n个数字,递归算法
    static int i=0;
    public static ListNode removeNthFromEnd2(ListNode head,int n){
        if(head==null)
            return null;
        head.next = removeNthFromEnd2(head.next,n);
        i++;
        if(i==n){
            //为删除元素
            return head.next;
        }
        return head;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值