1. 题目
2. 分析
我们需要删除倒数第n个节点,但是我们不知道链表的长度是多少。
2.1 先求长度
通过一次遍历,获取链表的长度,然后第二次便利删除倒数第n个,也就是将第(l-n)个的指针指向next.next 时间复杂度o(2l),空间复杂度o(1)
2.2 存储各个节点
减少方法1中的第二次遍历,采取空间换时间的方式,从数组或者list中直接o(1)复杂度获取节点。 时间复杂度o(l),空间复杂度o(l)
2.3 双指针
两个指针,其中一个永远快n步
3. 代码
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode newHead = head;
//快指针先走n步
ListNode fast = head;
for (int i = 0; i < n; i++) {
fast = fast.next;
}
if (fast == null) {
return head.next;
}
//一直后移
while (null != fast.next) {
head = head.next;
fast = fast.next;
}
//删除倒数第n个
head.next = head.next.next;
return newHead;
}