题目描述:(题目来源:19. 删除链表的倒数第 N 个结点)
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
这一题有个简单的方法就是快慢指针法(定位链表中的特定位置),快指针和慢指针最初都指向头节点。
一:先让快指针往后走n步,然后判断快指针是否为null,如果为null,证明这个n就是链表的长度,我们把第一个结点删除返回head.next就行了。
二:如果不为null,就让快指针和慢指针都往后移动,当快指针的next为null的时候,慢指针正好指向倒数第n+1个结点。
三:我们只需要把此时慢指针的next指向慢指针的next的next就行了,最后把head返回。
四:只遍历了一遍链表时间复杂度为O(n),只定义了一些辅助参数空间复杂度为O(1)。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode first = head;
ListNode second = head;
//如果是个空链表,直接返回就行了
if(head == null){
return head;
}
while(n > 0){
first = first.next;
n--;
}
//先让快指针往后走n步,然后判断快指针是否为null,如果为null,证明这个n就是链表的长度,我们把第一个结点删除返回head.next就行了。
if(first == null){
return head.next;
}
while(first.next != null){
first = first.next;
second = second.next;
}
//删除结点操作
second.next = second.next.next;
return head;
}
}