Amir
Amir

Reputation: 9

traversing singly linked list in Java

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.

Upvotes: 0

Views: 592

Answers (1)

Eran
Eran

Reputation: 393771

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.

Upvotes: 2

Related Questions