2015-01-24 3 views
0

Java에서 데이터 구조를 연구 중입니다.Java에서 쌍으로 연결된 목록을 뒤집습니다.

나는 연결 목록이 있습니다

1 -> 2 -> 3 -> 4 -> 5

을 그리고 링크 된 목록을 반대하고 싶습니다하지만, 한 쌍이다.

2 -> 1 -> 4 -> 3 -> 5

가 나는 코드를 작성하지만, 그것은 1 -> 3 -> 5되었다

private void reversePair(Node headNode) { 
    Node tempNode1 = null; 
    Node tempNode2 = null; 
    Node currentNode = headNode; 

    while(currentNode != null && currentNode.getNext() != null) { 
     tempNode1 = currentNode.getNext(); 
     tempNode2 = tempNode1.getNext(); 

     tempNode1.setNext(currentNode); 
     currentNode.setNext(tempNode2); 

     currentNode = currentNode.getNext(); 
    } 
} 

작동하지 않습니다, 나는 논리 구멍이 여기 모르겠어요.

내 코드와 솔루션의 문제점을 설명해 주시겠습니까?

+0

디버거를 사용하여이 단계를 수행하면 즉시 진행되는 작업을 볼 수 있습니다. –

+0

그래, 이미 했어, 나는 좀 이상하다. 그러나이 문제를 해결할 방법을 모르겠다. – KimchiMan

+0

그래서 두 노드를 교체 할 때, 그 중 하나에 대한 참조를 유지해야한다. 다음 두 개를 바꿔 쓰면, 참조를 유지 한 것에'setNext'를 부를 수 있습니다. –

답변

1

코드 내에 두 가지 문제가 있습니다. 첫 번째는 메소드에 전달한 노드가 메소드 외부에서 변경되지 않는다는 것입니다. 여전히 1을 가리 킵니다. 번째 문제는 temp2-> 3이 2-> 1, 1-> 3 동안의 끝에는

를 구한 후

temp1-> 2 같은 것을 ... while 루프 안쪽

2-> 1-> 3-> 4 - 현재 확인되지만 > .... :이리스트를 참조

말했듯

1) headNode, 방법 밖에, 포인트 (1), 그래서 1-> 3-> 4로 - ...

2) 반복 스왑 3, 4 (4-> 3,3-> 5) 동안 다음하지만 여전히 1 3> 점, 그것은 '케이 변경! 따라서 메서드 외부의 headNode는 1-> 3-> 5 -> ...

두 번째 문제를 쉽게 해결해야합니다. 첫 번째는 더 어렵습니다. 2 (새로운 머리)를 저장하고 새 머리로 반환하는 것이 좋습니다. 우아한 것은 아니므로 메서드를 headNode = reversePair(headNode)으로 호출해야하지만 제대로 작동합니다.