思路:倒数第n个 关键信息点在于 要处理的点在倒数第n个和最后一个元素有关
所以突破点可以从其和最后一个元素的距离为n的点来设定
而肯定从头结点开始走 所以先找出其合适的距离为好
/**
* 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 {
public ListNode removeNthFromEnd(ListNode head, int n) {
//递归的方法: 可如何返回呢?
//两个指针 其距离为n
//n=1 left=right right-left+1
//n=2 right-left+1 n=3 right-left+1 删除left位置的链表
if(head==null) return null;
ListNode left=head;
ListNode right=head;
//n在范围之内 说明肯定可以找到left 先将right右移n-1位
for(int i=1;i<=n-1;i++){
right=right.next;
}
//如果已经到了最后一个呢?
if(right.next==null){
//直接删除头结点
//head.val=null;
head=head.next;
return head;
}
while(right.next!=null){
//一直到right为最后一个
right=right.next;
if(right.next!=null){
left=left.next;
}
}
//删除left结点
left.next=left.next.next;
return head;
}
}
大佬解法:
其递归思想是我想做做不到的。
链表这种递归 是从最后一个开始处理的
当最后一个为1 每次到之后+1
当处理到倒数第n个时
赋值这块很重要!
//递归从后开始处理 如果是head.next是null就返回null
//如果不为空 那么记录一下是第几个
//并判断是否在需要处理的位置上
//如果是 那么返回本次递归的 head.next 作为下一次递归的的head.next 相当于删除操作
//如果不是 那么直接返回本次的head