leecode19—— 删除链表的倒数第 N 个结点

 

 思路:倒数第n个 关键信息点在于  要处理的点在倒数第n个和最后一个元素有关

所以突破点可以从其和最后一个元素的距离为n的点来设定

而肯定从头结点开始走 所以先找出其合适的距离为好

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //递归的方法: 可如何返回呢?
        //两个指针 其距离为n
        //n=1  left=right  right-left+1
        //n=2  right-left+1   n=3 right-left+1  删除left位置的链表
        if(head==null) return null;
        ListNode left=head;
        ListNode right=head;
        //n在范围之内  说明肯定可以找到left   先将right右移n-1位
        for(int i=1;i<=n-1;i++){
            right=right.next;
        }

        //如果已经到了最后一个呢?
        if(right.next==null){
            //直接删除头结点
            //head.val=null;
            head=head.next;
            return head;
        }

        while(right.next!=null){
            //一直到right为最后一个
            right=right.next;
            if(right.next!=null){
                left=left.next;
            }
        }
        //删除left结点
        left.next=left.next.next;
        return head;
    }
}

大佬解法:

其递归思想是我想做做不到的。

链表这种递归 是从最后一个开始处理的

当最后一个为1  每次到之后+1

当处理到倒数第n个时

赋值这块很重要!

//递归从后开始处理  如果是head.next是null就返回null

        //如果不为空 那么记录一下是第几个

        //并判断是否在需要处理的位置上

        //如果是 那么返回本次递归的 head.next  作为下一次递归的的head.next  相当于删除操作

        //如果不是  那么直接返回本次的head

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值