0

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.

3
  • 1
    Your question title doesn't really relate to what you're doing. I made the incorrect assumption that you were just trying to visit each node. Could you maybe improve it? Commented Dec 11, 2016 at 14:35
  • This also seems to scream for null pointer exceptions. You create a start node; which probably means that it hasn't any followers in that list. Iterating that sounds like asking for trouble. Commented Dec 11, 2016 at 14:36
  • @GhostCat except that two lines down, there's slow.next = head; As one line above you have slow=fast=start, the slow.next=head means 'start is initialized with the meaning of node at index -1 and slow/fast are set to this position'. Then everything is fine and dandy if the list contains N elements because the for(int i=1; i<=n+1; i++) cycle doesn't test against null. Commented Dec 11, 2016 at 14:47

1 Answer 1

2

slow is a local variable, so changing its value to refer to a new instance of ListNode doesn't affect the original list.

However, if slow refers to a ListNode that belongs to your list, changing slow.next to refer to a new instance changes the state of your list.

It may be clearer if you use a setter to modify the next node :

slow.next = slow.next.next;

would be equivalent to :

slow.setNext(slow.next.next);

So if slow refers to a ListNode that belongs to your list, changing its state is changing the state of your list.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.