题目
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
方法一:递归
思路:
利用递归思想遍历链表,然后从链表最后一个元素开始判断是不是题目传来的要删除的。如果是就找到上一个节点来删除。
java
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode s=new ListNode(-1,head);
inte(s,n);
return s.next;
}
public int inte(ListNode head, int n){
if(head==null){
return 0;
}
int count= inte(head.next,n);
if(count==n){
head.next=head.next.next;
}
return count+1;
}
}
方法二:双指针
//双指针,要删除第几个元素就让一个指针提前移动n+1;
//然后两个指针同时移动直到找到要删除的节点
java
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//双指针,要删除第几个元素就让一个指针提前移动n+1;
//然后两个指针同时移动直到找到要删除的节点
ListNode s= new ListNode(-1,head);
ListNode p1=s;
ListNode p2=s;
//先移动一个指针
for(int i=0;i<n+1;i++){
p2=p2.next;
}
while(p2 !=null){
p1=p1.next;
p2=p2.next;
}
p1.next=p1.next.next;
return s.next;
}
}