https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
最直接的思路是使用一个 ListArray 将链表中每个指针都存储,这样可以直接把数组一样操作链表。
不过在提交的时候发现了一些边界值的问题,需要稍微注意一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { List<ListNode> lns=new ArrayList<>(); while(head!=null){ lns.add(head); head=head.next; } int s=lns.size(); if(s<n || s==1) return null; if(s-n-1>=0){ ListNode t=lns.get(s-n-1); if(t.next!=null) t.next=t.next.next; return lns.get(0==n?1:0); }else{ return lns.get(1); } } }
|
运行时间还不错,基本很快了。不过看了 Solution,发现居然有更快的办法和更好的解决边界值得办法。
可以使用两个指针,第一个指针向后移动 n 的距离,然后一起向后移动直到第一个指针移动到末尾,这时,第二个指向的就是将要被删除的元素的之前的一个元素,思路很棒!
另外就是如果在头部添加一个空元素,那么就可以避免在链表长度比较短的时候对很多情况的讨论。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode flag=new ListNode(0); flag.next=head; ListNode first=flag,second=flag; for(int i=0;i<=n;i++) first=first.next; while(first!=null){ first=first.next; second=second.next; } second.next=second.next.next; return flag.next; } }
|