题目

一般来说,题目越是简洁就越经典,看这个题目的表述,估计这道题很tmd经典

题解

/**
 * 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 {
    
    // 计数器,用来递归是看是否到了倒数第N个节点
    int c = 0;
    
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null){
            return null;
        }else{
            head.next = removeNthFromEnd(head.next, n);
        }

        c++;
        if(c == n){
            return head.next;
        }else{
            return head;
        }
    }
}

思路

看到倒数第N个节点,首先要考虑递归先找到最后一个节点,然后从倒数第一个开始数起,倒数第N个就是第N个节点

首先当head不为空时,说明本节点并非是最后一个节点的next,按照递归找最后一个节点的方法来看,即head = head.next

在题解中,递归出来的时候即代表了已经从最后一个开始往回走了,也就是代表计数器可以开始计数
当c != n时,代表了这个节点不是倒数第N个节点,这时候指向不用变,
而c == n时,就代表了这个节点就是倒数第N个节点,这个节点被删除,则将自己本身,等于自己的下个节点即可,这样从前指向自己的节点就会指向自己的下一个节点,即删除了本节点