有两种做法,一种是先便利获得size,然后再remove
另一种做法通过快慢指针,之间相差n的gap,之后再进行remove
// normal way to solve
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null){
return head;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode cur = dummy;
int length = 0;
while(cur.next != null){
length++;
cur = cur.next;
}
length = length - n;
cur = dummy;
while(length > 0){
length--;
cur = cur.next;
}
cur.next = cur.next.next;
return dummy.next;
}
}
//Two pointer way
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
// Advances first pointer so that the gap between first and second is n nodes apart
for (int i = 1; i <= n + 1; i++) {
first = first.next;
}
// Move first to the end, maintaining the gap
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}