题目
一般来说,题目越是简洁就越经典,看这个题目的表述,估计这道题很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个节点,这个节点被删除,则将自己本身,等于自己的下个节点即可,这样从前指向自己的节点就会指向自己的下一个节点,即删除了本节点