题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例
提交的代码
class Solution {
//快慢指针
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fakeHead=new ListNode(-1,head);
ListNode slow=fakeHead;
ListNode fast=fakeHead;
//先让快指针移动n次
while(n-->0)fast=fast.next;
//fast移动到链的尾部,slow也移动到了要删除的节点的前驱
while(fast.next!=null){
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return fakeHead.next;
}
}
使用的方法就是快慢指针,先让fast指针移动n次,之后fast和slow一起移动,当fast到达最后一个节点的时候,slow也就到了需要删除节点的前驱了。
老样子,使用虚头方便删除。
学习到的东西
我在看题目描述的时候,看到底下有进阶的描述:仅一趟遍历就完成删除,当时想到的也是快慢指针的方法,但是一想本质上不也是两次扫描吗,就没写,看了别人的解答才发现都是用的这个方法,仔细一想确实是一趟- -。下次一定要忍住不看解答!