I have a simple Java question. As shown in the below code:
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode start = new ListNode(0);
ListNode slow = start, fast = start;
slow.next = head;
//Move fast in front so that the gap between slow and fast becomes n
for(int i=1; i<=n+1; i++) {
fast = fast.next;
}
//Move fast to the end, maintaining the gap
while(fast != null) {
slow = slow.next;
fast = fast.next;
}
//Skip the desired node
slow.next = slow.next.next;
return start.next;
}
Start, fast and slow address the same object. I don't get why "slow = slow.next;" will not change the start object, but "slow.next = slow.next.next;" will change the start object.
slow.next = head;As one line above you haveslow=fast=start, theslow.next=headmeans 'start is initialized with the meaning ofnode at index -1and slow/fast are set to this position'. Then everything is fine and dandy if the list contains N elements because thefor(int i=1; i<=n+1; i++)cycle doesn't test againstnull.