19. 删除链表的倒数第N个节点
题目描述:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路分析:
先考虑最直观的方法,链表的长度是未知的,可以先通过一遍扫描将元素存储在一个动态数组ArrayList中,然后从数组头挨个将元素添加到链表中,跳过倒数第n个节点即可,代码如下:
import java.util.ArrayList;
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ArrayList<ListNode> list=new ArrayList<>();
ListNode dummyHead=new ListNode(0);
ListNode cur=dummyHead;
while(head!=null){
list.add(head);
head=head.next;
}
for(int i=0;i<list.size();i++){
if(i==list.size()-n){
continue;
}
cur.next=list.get(i);
cur=cur.next;
}
return dummyHead.next;
}
}
但是上述代码运行会发现有些测试用例不通过,思考一下为什么?
如果改为如下代码,则可以通过:
import java.util.ArrayList;
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ArrayList<ListNode> list=new ArrayList<>();
ListNode dummyHead=new ListNode(0);
ListNode cur=dummyHead;
while(head!=null){
list.add(head);
head=head.next;
}
for(int i=0;i<list.size();i++){
if(i==list.size()-n){
continue;
}
cur.next=new ListNode(list.get(i).val);
cur=cur.next;
}
return dummyHead.next;
}
}