- 题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例:输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
- 双指针(快慢指针)
public ListNode removeNthFromEnd(ListNode head, int n){
// 设置两个快慢指针
ListNode first;
ListNode last;
// 设置前驱的辅助节点pre
ListNode pre = new ListNode(0);
// 分别把慢指针设置在pre上,快指针设置在head上,把head接在pre的后面
pre.next = head;
last = pre;
first = head;
while (first != null){
first = first.next;
// 当快指针开始往前走了n步之后,慢指针也该开始走了
if (n <= 0)
last = last.next;
n--;
}
// 最后干掉慢指针后面的节点就成功删除了倒数第n个节点
last.next = last.next.next;
return pre.next;
}
注意要将慢指针设置为前驱节点,否则例如在链表为[1],n=1的时候,就会导致空指针异常。因为慢指针要指向的是即将删除的节点的前一个节点,所以把慢指针指向head节点不是一个好的选择。
- 另外用栈也可以实现,记得由于栈先进后出的特性,把链表放进去之后再推出来就是倒序