题目:给你一个链表,删除链表的倒数第
n
个结点,并且返回链表的头结点。
思路:要删除倒数第N个结点,第一想到的还是循环,如果要删除结点,则需要知道一共要循环多少次,然后找到要删除的结点的上一个结点,直接就可以该结点.next = 该节点.next.next
但是题目不是直接告诉要删除第几个,而是倒数第几个,转换一下那么就是删除第(链表长度减去N+1)个结点,循环指向要删除结点的前一个结点。
新建一个结点q指向原链表的头结点,不能动,最后返回它 -> 找到要删除链表的前一节点 -> 删除 -> 返回q
当然还有特殊情况,如果是长度只有1,删除一个结点,直接返回null ;如果长度为n,倒数第n个,即删除头结点,那么直接返回q.next
public static ListNode removeNthFromEnd(ListNode head,int n){
//先找到改元素,然后删除
ListNode q = head;
int l = length(head)-n+1;
for(int i=1;i<l-1;i++){
head = head.next;
}
ListNode p = head.next;
if(length(head)==1)
q=null;
else if(length(head)-n==0)
q = q.next;
else head.next = p.next;
return q;
}
第二种递归:
首先不知道要删除的是哪个元素,循环几次,设置i进行计数(即循环的次数),当i==n时,此时就是要删除的元素,直接返回它下一个元素跳过它即可。i++是回溯的时候➕,从后往前+,所以i直接和n进行比较
//删除倒数第n个数字,递归算法
static int i=0;
public static ListNode removeNthFromEnd2(ListNode head,int n){
if(head==null)
return null;
head.next = removeNthFromEnd2(head.next,n);
i++;
if(i==n){
//为删除元素
return head.next;
}
return head;
}