题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]
代码实现:
public class LC19 {
}
/**
* 双指针法
* fast: 先让fast前进到n+1步,保证当fast指向null时,slow正好指向要删除节点的上一个元素
* slow:最终指向要删除节点的上一个元素,slow.next = slow.next.next
*/
class Solution4 {
public ListNode removeNthFromEnd(ListNode head, int n) {
//判断n合法
if (n < 1) {
return head;
}
//虚拟头结点
ListNode virtualHead = new ListNode(0,head);
//定义快慢两个指针
ListNode slow = virtualHead;
ListNode fast = virtualHead;
for (; n-- > 0; ) {
fast = fast.next;
}
//fast再多走一步,保证slow指向要删除节点的上一个元素
fast = fast.next;
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return virtualHead.next;
}
}