0
点赞
收藏
分享

微信扫一扫

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

萧让听雪 2022-05-03 阅读 74

 

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

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

当然还有特殊情况,如果是长度只有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 条评论