题目
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例1
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例2
输入:head = [1], n = 1
输出:[]
解题思路
第一遍写,我是准备用一次遍历求长度,然后找到倒数第n个节点,但是没搞出来。
看了别人的解法后,学习到了快慢指针。
开始也没明白,为啥快指针走完,这个慢指针为啥就走到了倒数第n的位置呢,看了几遍后发现这是一个数学问题,例上图,删除倒数第二的位置,快指针走2步先,然后一起走,直到快指针的next指针为空,即走到最后一个节点,走了3步,那么慢指针也是走了3步,到了下标为3的位置,这个位置其实是倒数第三个节点的位置,这里快指针走过的总步数是总节点数-1,上图中就是5步,如果快指针走过的步数是总结点数,那么慢指针则会走到要删除的节点的位置,而我们需要的是删除这个位置,所以我们让快慢指针是从第一个节点开始,然后慢指针就可以走到要删除节点前的一个位置。
代码
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode left=head;
ListNode right=head;
for(int i=0;i<n;i++){
right=right.next;
}
if(right==null){
return head.next;//这一步用来判断删除头结点的情况
}
while(right.next!=null){
right=right.next;
left=left.next;
}
left.next=left.next.next;
return head;
}