2014-06-15 3 views
-2

어떻게 링크 된 목록 노드를 만들고 일부 데이터를 추가 한 다음 다른 방법으로 헤드를 이동해도 헤드가 여전히 호출 수신자 방법으로 유지됩니까? 예를 들어링크 된 목록 포인터 범위

:

public static void append(Node n, int d) { 
    while (n.next != null) { 
     n = n.next; 
    } 

    n.next = new Node(d); 
} 

public static void test(Node n) { 
    n = n.next; 
} 

public static void main(String[] args) { 
    Node head = new Node(5); 
    append(head, 4); 
    append(head, 3); 

    test(head); //this moves the head to head.next 
    //why is head still = 5 after we get here? 
} 
+4

'test' 메소드는 ** 아무 것도 ** 수행하지 않습니다. –

+0

머리를 참고로 통과해야합니까? 테스트에서, n = n.next, n.data = 4를 그 메소드에서 움직였을 때, main에서 어떻게 온다? head.data = 5? – MiketheViking90

+0

@ MiketheViking90 "머리를 참고로 전달해야합니까?" 아니요, 참조는 값으로 전달됩니다. – Boann

답변

0

next는 속성이 아닌 방법. test 방법은 n.next에 대한 참조를 가져 오는 것일뿐 "머리를 움직이지 않습니다."

1

append의 경우 n = n.next 행은 인수로 전달 된 원래 노드에 영향을 미치지 않으며, 경우에 따라 head이됩니다. 왜?Because Java is pass by value. 즉, 메서드 내부에 head (메서드 내부에 n으로 수신 됨) 참조를 수정하면 원래 참조에 영향을 미치지 않습니다. 따라서 head은 여전히 ​​메모리 (동일한 개체)의 동일한 위치를 참조합니다. 당신이 지역 변수를을 만들기 때문에 아무것도하지 않는 test 또한

, 당신의 방법

Node next = ...; 

한 다음에 n.next을 할당. 그러나이 변수는 그 메소드 내부에만 존재하기 때문에 외부 변수에는 영향을주지 않습니다.

+0

"n = n.next 줄은 원래 노드 n ... n이 메모리의 동일한 위치를 계속 참조 함"에 영향을 미치지 않습니다. 이것은 매우 오도하는 것입니다. 이 코드는 메서드 내에서 완벽하게 작동합니다. – Boann

+0

@Boann이 명확하게 편집했습니다. 지금인가? – Christian