2017-12-28 76 views
-1

나는 이해하기가 힘듭니다. 코드 스 니펫 자체는 이중 연결된 목록의 생성자입니다. 그러나 마지막 행은 다음과 같이 말합니다. (head = head.next) .previous = null; 이것은 아마도 배열 a에서 노드를 추가하는 데 사용되는 임시 노드를 제거합니다. 그러나 어떻게 작동합니까? 누군가가 명확하고 분리 된 선으로 분해 할 수 있다면 매우 도움이 될 것입니다.Java 구문이 혼동했습니다.

// standard constructor 
public DoublyLinkedList() { 
    head = tail = null; 
    numElements = 0; 
    changes = 0; 
} 

// constructor 
public DoublyLinkedList(T[] a) { 
    this(); // call the standard constructor 

    Objects.requireNonNull(a, "a is null!"); 

    head = tail = new Node<>(null); // a temporary node 

    for (T value : a) { 
     if (value != null) { 
      tail = tail.next = new Node<>(value, tail, null); // new node at the back 
      numElements++; 
     } 
    } 

    // remove the temporary node 
    if (numElements == 0) head = tail = null; 
    else (head = head.next).previous = null; // the problematic bit 
} 
+0

이것은 논리 질문입니까 구문 질문입니까? 정확히 당신이 이해하지 못하는 것은 무엇입니까? – shmosel

+0

@shmosel 나는 그것이 구문 문제가 더 많은 것 같아요, 주석 주셔서 감사합니다. –

답변

0

그것은 이렇게 가고 :

if (numElements == 0) { 
    head = null; 
    tail = null; 
} 
else { 
    head = head.next; 
    head.previous = null; // the problematic bit 
} 

명 원래의 방법을 쓸해야한다, 당신이 방금 발견으로, 혼란 코드를 만드는 다음은 생성자입니다.

0
head = head.next; 
head.previous = null; 
+2

이 코드 스 니펫은 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 정말로 도움이됩니다. 앞으로 독자의 질문에 대답하고 있으며 코드 제안에 대한 이유를 알지 못할 수도 있습니다. –

0

내가 당신을 위해 그것을 시험해 보도록하겠습니다. 난 당신이 어려움 이해가있는 코드의 일부는 다음과 같은 것을 가정입니다 :

else (head = head.next).previous = null; // the problematic bit 

괄호의 내부 표현의 코드 조각은 본질적으로 다른, 다음이됩니다 위의 의미, 먼저 평가 사람들은 이미 언급했다.

head = head.next; // move onto the next node 
head.previous = null; 

위의 논리를 이해하는 데 어려움이있는 경우 아래 코드를 실행 해보십시오. 4 + 2는 나누기 연산 전에 먼저 계산됩니다.

System.out.println((4 + 2)/2); 
0

처음으로 .next을 사용하려면 임시 노드가 필요합니다. 그것은 머리에 쓰여졌습니다. 그러면 더 이상 필요 없게되면 머리에서 제거됩니다.

코드에서 .previous이 루프에서 설정되지 않아 작동하지 않는 문제가 있습니다.