法一 单指针(两次遍历)
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null)
return null;
int L = 0;
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode prev = dummyHead;
while(prev.next != null){
L ++;
prev = prev.next;
}
prev = dummyHead;
for(int i = L - n; i > 0; i --){
prev = prev.next;
}
ListNode del = prev.next;
prev.next = del.next;
del.next = null;
return dummyHead.next;
}
}
法二 双指针(一次遍历)
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
while(n > 0){
n --;
fast = fast.next;
}
if(fast == null)
return head.next;
ListNode slow = head;
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
}