두 개의 링크 된 목록이 반전됩니다. 즉, 다른 링크 된 체인 테이블의 테일 포인터는 하나의 링크 된 목록의 테일 포인터에서 다른 링크 된 목록으로 합병에서 역전됩니다. 아래에서 두 개의 링크 된 목록의 반전 교대의 아이디어 및 구현 코드가 자세히 소개됩니다.
1. 문제 설명
링크 a와 b
A : 1-> 2-> 3-> 4
B : a-> b-> c-> d
두 개의 링크 된 목록을 교대로 바꾸십시오.
4-> D-> 3-> C-> 2-> B-> 1-> a
노드 유형 정의는 다음과 같습니다.
Classnode {공개 노드 다음; 2. 소스 코드 :
처리 후 2 개의 A와 B 링크 된 목록이 연결된 목록으로 다시 전달됩니다.
Node reverse_merge (node a, node) {a.next = b a) .next; b.next = null; nexta = a.next; a.next = b; b = nightb; space (nexta.next! = Null) {b.next = a; A = nexta; nexta = a.next A.next = b = nextb.next = b; 세, 분석 :
이 프로그램은 세 부분으로 나뉩니다.
1) 이전 링크 된 목록 A 및 b를 처리합니다
2) 사이클 -처리 프로세스의 핵심 처리 부분은 여기에서 반복 될 수 있습니다. 우리의 목표는 빨간색 링크 모드를 달성하기 위해서는 Dark Red Circle 1과 Blue Circle 2 2가 있습니다.
그러나 A가 특별히 처리 된 노드 A. A가 위치한 노드에 대해서만 다음 = NULL 작동이 필요합니다. 즉, 1의 첫 번째 원자는 사이클 외부로 구현되어야합니다.
두 가지 메소드를 사용하는 경우 1 개의 손가락을주기 밖에 놓으면됩니다. 따라서 2에 기술 된 원자 구조가 여기에 사용된다.
원자 구조에 필요한 정보
이 시점에서 링크 된 목록의 상태는 다음과 같이 가정하면 특정 주기로 가면 다음과 같습니다.
보다 직관적 인 그리기 방법은 다음과 같습니다.
3 개의 노드 -2,3 및 C가 포함됩니다. 빨간색 부분은 우리가하고 싶은 링크 방법입니다. C-> 2,3-> C를 연결하려면 해당 위치를 기록 할 수있는 포인터가 있음을 알아야합니다. 따라서 사이클 전에이 세 가지 요소의 주소를 마스터해야하며, 같은 방식으로 처리 후 동일한 방식으로 처리 해야하는 원자 구조를 마스터해야합니다.
예를 들어, 다음 방법은이주기에서 설계된 세 가지 노드의 주소를 기록합니다.
A, NA 및 B는 해당 노드에 대한 포인터 또는 참조를 나타냅니다.
처리가 완료된 후에는 다음 원자 구조와 관련된 노드를 동일한 방식으로 기록하여 통일 된 논리에 따라 사이클을 실행할 수 있도록해야합니다.
이러한 할당 작업은 Cycle Body의 중간 코드가 위에서 지정된 이름을 기준으로합니다. 또한, Nextb는 C-> D 연결이 끊기 전에 이전 D 노드의 주소를 기록하기위한 코드의 중간 변수로 정의됩니다. C에서 2는 접촉 D를 잃어 버리기 때문입니다.
3) 전체 루프가 준비되기 전에 -준비 작업으로 인한 문제를 해결하십시오.
노드 A는 너무 특별하기 때문에 노드 A를 처리하지 않았으며 포함시킬 수있는 적절한 원자 구조가 없습니다. 그래서 우리는 그것을주기 밖으로 내놓고 순환을 준비합니다.
그 후, 우리는 사이클에 1, 2 및 b를 넣을 수 있습니다. 여기에는 하나의 노드 A와 B 만 있으며 별도로 처리해야합니다.
4) 전체 루프 후 -최종 처리
B 링크 된 목록이 끝에 도달한다는 것을 알게되면 사이클이 끝납니다. 그러나 현재, 처리 노드가 있습니다. 우리의주기는이 원자 구조에서 멈출 것입니다.
최종 작업으로서, 우리는 원자 구조의 처리를 찾을 수있는 방법이 없기 때문에 D-> 3,4-> D의 링크 단계도 수동으로 처리해야합니다.
이것은 완전한 방법이 아니며, 예를 들어 입력 A와 B가 다르면 처리되지 않은 많은 것들이 있습니다. 또한 노드 데이터 구조는 완전히 정의되지 않았지만이 기사의 초점은 아닙니다.
위의 자세한 분석을 통해 모든 사람이 두 개의 링크 된 목록 대체 합병의 방법과 구현을 이해하도록 돕기를 바랍니다.