2017-11-22 2 views
1

내가 링크 된 목록을 학습 오전이 코드는 단어와 정의를 가지고하는 데 사용됩니다자바 : 링크리스트의 노드 질문

public void add(WordMeaning wm) 
{ 

    WordMeaningNode data = new WordMeaningNode(wm); 

    if (head == null) 
     head = data; 

    else 
    { 
     WordMeaningNode current = head, prev = null; 
     boolean found = false; 

     while (current != null && !found) 
     { 
      if (data.getWordMeaning().getWord().compareTo(current.getWordMeaning().getWord()) < 0) 
       found = true; 

      else 
      { 
       prev = current; 
       current = current.next;   
      } 

     } 

     data.next = current; 

     if (prev == null) 
      head = data; 

     else 
      prev.next = data; 


    } 

} 

다음 코드를 가로 질러 온 다음 LinkedList의에서 다른 값으로 알파벳 순으로 단어를 정렬 . 사전 순으로 정렬하지 않고 LinkedList에 단어를 저장하는 방법을 알고 있지만 data.next = current 및 그 뒤에 나오는 if 문으로 시작하는 마지막 부분을 이해하는 데 문제가 있습니다. 특히 data.next와 current는 둘 다 null이어야하기 때문에 어떻게 서로 같을 수 있습니다. 나는 또한 마지막 else 문에서 prev.next가 while 루프의 이전 else 문을 기반으로 동일한 값이어야하므로 현재를 대체 할 수없는 이유를 이해하지 못합니다.

+1

_ "데이터를 이해하는 데 어려움이 있습니다 ... 데이터와 다음의 동등성이 어떻게 같습니까?"- 질문이 명확하지 않습니다. 'data.next = current' 문은 _assignment_는'current'의 값을'data.next'에 복사합니다. 그 문장 다음에,'data.next'는'current'가 참조하는 것과 같은 객체를 가리킬 것입니다. 당신이 이해하지 못하는 것은 무엇입니까? –

+0

while 루프에서 일치하는 위치를 찾으면 데이터 노드를 현재 노드 (while 루프에서 찾은 노드)와 이전 노드에 연결해야합니다. 목록이 비어 있으면 요소가 머리에 추가됩니다. 이런 일이 일어나고 있습니다. [이것을 확인하십시오] (http://www.algolist.net/Data_structures/Singly-linked_list/Traversal) – sandy

답변

1

간단한 대답은 평등하지 않다는 것입니다. 코드 data.next = current;에서 두 개가 동일하다는 것을 주장하지 않는다는 것을 잊었을 것입니다. data.nextcurrent으로 설정합니다. 아직도 이런 식으로, 이해가 그것에 대해 생각하지 않는 경우

:

prev 
prev.next ------> current 
       current.next 

그러나, 우리는이 inbetween data을 삽입 할 :

노드 prevcurrentprev.next == current 때문에 노드에 연결되어 . 여기에 목록이 나중에 어떻게 보일지입니다 :

prev 
prev.next ------> data 
       data.next ------> current 
           current.next 

따라서, 두 가지 일이 필요

  • prev.nextdata로 설정해야합니다. (링크를 변경하고 싶지 않으므로 이 아니라 prev.next을 작성해야합니다.
  • data.nextcurrent으로 설정해야합니다. 현재 이 null 일 수 있다는 것도 맞지만, null로 설정할 수 있으므로 문제가되지 않습니다. 이전이 존재하지 않는 경우 prev.next에 액세스 할 수 있기 때문에

그것은, prev가 null의 경우와 관련된 더. 이것이 별도로 점검되는 이유입니다.

2

이 코드는 결과 목록의 단어가 오름차순이되도록 단어를 링크 된 목록에 삽입합니다. data은 단어가있는 새 노드입니다. if 내부 조건 while 루프가 current 노드의 단어가 data 노드의 단어보다 큰지 확인하는 루프입니다. 그렇다면 found을 true로 설정하고 current 노드를 이전에 할당하고 current의 다음 노드를 current 노드에 할당합니다. 이 프로세스는 while의 조건이 거짓으로 평가 될 때까지 반복됩니다. current 노드 단어가 found true가 될 data 노드 단어보다 더 큰되면

  1. :

    두 여기 경우가 있습니다.이제 우리는 current의 단어가 알파벳보다노드의 단어보다 큽니다. 따라서 current 노드를 data 노드의 다음 노드로 만듭니다. 이것은 정확히 data.next = current;이하는 일입니다. 또한 data 노드의 단어가 prev 노드의 단어보다 알파벳순으로 더 크다는 것을 알고 있으므로 노드 prev의 다음 노드로 data 노드를 만듭니다. 정확히 prev.next = data;else입니다.

  2. 이 경우는 목록이 비어있는 경우입니다. if (prev == null) head = data;은 목록이 비어있을 때 data 노드를 head 노드로 만듭니다.