我有一个简单的Java问题。如下代码所示:

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;
    }

开始,快速和慢速地址相同的对象我不明白为什么“slow=slow.next;”不会改变开始对象,但是“slow.next=slow.next.next;”会改变开始对象。

最佳答案

slow是一个局部变量,因此将其值更改为引用ListNode的新实例不会影响原始列表。
但是,如果slow引用的是属于列表的ListNode,则将slow.next更改为引用新实例将更改列表的状态。
如果使用setter修改下一个节点,可能会更清楚:

slow.next = slow.next.next;

相当于:
slow.setNext(slow.next.next);

因此,如果slow指的是属于列表的ListNode,则更改其状态就是更改列表的状态。

关于java - 在Java中遍历单链表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41087256/

10-11 17:10