链表——删除链表的倒数第 N 个结点
【解法1】双指针
快慢指针:由于我们要找到倒数第n个结点,因此我们可以使用快指针fast和慢指针slow同时对链表进行遍历,并且fast比slow超前n个结点。当fast遍历到null时,slow刚好处于倒数第N个结点。但由于是删除结点,必须要找到其前缀,有while(fast.next != null)。注意可能会要求删除第一个结点
public ListNode removeNthFromEnd(ListNode head, int n) {
//快慢指针,快指针先走n步,然后快慢一起走,注意可能要删除第一个节点
//要找到删除结点的前缀,才便于删除
ListNode slow = head,fast = head;
while(n-->0){
fast = fast.next;
}
if(fast == null){
return head.next;
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
//时间复杂度O(N),空间复杂度O(1)