1. 问题描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
2. 思路分析:
① 题目还是容易理解清楚的,因为要删除的是倒数第n个节点,所以想到使用递归来解决,因为递归在求解的时候会层层返回,我们正是可以利用这个特点来解决这个问题,每返回一次那么计算一次表示的是当前是第几个节点,所以需要使用一个全局变量来记录从后往前的时候当前返回的是第几个节点,通过判断是第几个节点那么我们可以比对需要删除的目标节点,假如发现当前的节点是需要删除的节点那么直接返回递归调用结束的结果即可,因为返回到这一层的是当前节点的下一个节点而这个节点正是需要删除的所以直接返回下一个节点即可,在节点连接的时候这个元素就被忽略掉了
② 当发现当前节点不是删除的节点的时候,需要将当前节点的next指针域指向递归调用返回的下一个节点即可,也就是将当前节点与当前节点之后的节点连接起来(每当递归方法之后那么返回的结果是当前节点的下一个节点)思路还是比较简单的看一下代码就比较清楚了
③ 使用递归这个层层返回的特点还是挺有好处的,特别是需要从后往前计算结果的那种但是常规的方法只能够做到从前往右的话使用这个特点就非常方便了,并且递归不仅仅是可以从后面进行计算,也可以从前面进行计算,因为在递归的方法之前调用进行计算即可,递归方法之后调用就是从后往前了
3. 代码如下:
public class Solution {
int count = 0;
public ListNode removeNthFromEnd(ListNode head, int n) {
/*使用递归来进行修改*/
if (head == null) return null;
ListNode cur = removeNthFromEnd(head.next, n);
count++;
if (count == n){
return cur;
}else{
head.next = cur;
return head;
}
}
}