1、递归:
- 结束条件是节点是否为null;
- 然后递归调用,每次调用返回当前的倒数序号,比如说null为0,倒数第一个就是0+1,依次加1;
- 当前函数返回的整数表示当前的节点是倒数第几个;
- 返回到上一级后,判断返回的序列号;比如说我们要删除倒数第二个,如果返回倒数第三层的x=2,就删除当前元素的下一个元素;(因为返回的x一定是下一层的序号)
- 需要注意的是:
- 有可能删除第一个元素,但是第一个元素没有前一个节点,所以需要添加一个虚拟节点;
java
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode demy = new ListNode();
demy.next = head;
demo(demy,n);
return demy.next;
}
public int demo(ListNode node,int n){
if(node==null){
return 0;
}
int x = demo(node.next,n);
if(x==n){
node.next= node.next.next;
}
return x+1;
}
}
2、快慢指针法
- 因为可能删除第一个节点,所以需要一个虚拟节点,
- 删除元素,需要当前删除元素的上一个节点来操作;
- 比如说:删除倒数第二个元素,那就需要找到倒数第3个元素;
- 快慢指针,那就是让快指针先走三步;然后两个指针一起走;
- 当快指针走到null时,正好慢指针就是到倒数第三个元素;
- 然后使得left.next=left.next.next;
java
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode left = dummy;
ListNode right =dummy;
int i =0;
while(i<n){
right = right.next;
i++;
}
while(right.next !=null){
left = left.next;
right = right.next;
}
left.next =left.next.next;
return dummy.next;
}
}