이 문제에서는 연결 리스트의 선두에 대한 포인터와 정수 k가 주어진다. k 크기의 그룹에서는 연결 목록을 반대로 해야 합니다. 예를 들어 -
입력 :1 <-> 2 <-> 3 <-> 4 <-> 5 (이중 연결 리스트), k =3출력 :3 <-> 2 <-> 1 <-> 5 <-> 4사전>해결책을 찾기 위한 접근 방식
이 문제에서는 이 문제를 해결하기 위해 재귀 알고리즘을 만들 것입니다. 이 접근 방식에서는 재귀를 사용하고 이를 사용하여 문제를 해결할 것입니다.
예시
#include네임스페이스 std;struct Node { int data; Node *next, *prev;};// 노드를 list로 푸시하는 push 함수Node* push(Node* head, int data) { Node* new_node =new Node(); new_node->data =데이터; new_node->다음 =NULL; 노드* TMP =헤드; if (head ==NULL) { new_node->prev =NULL; 머리 =new_node; 리턴 헤드; } while (TMP->next !=NULL) { // 마지막 노드로 이동 TMP =TMP->next; } TMP->다음 =new_node; new_node->prev =TMP; 리턴 헤드; // 헤드에 대한 포인터 반환}// 주어진 목록을 인쇄하는 함수 printDLL(Node* head) { while (head !=NULL) { cout < data <<" "; head =head->next;}cout < 이전 =NULL; 노드 *TMP, *CURRENT =헤드, *newHead; 정수 개수 =0; while (CURRENT !=NULL &&count 이전; 현재->이전 =현재->다음; 현재->다음 =TMP; 현재 =현재->이전; 카운트++; } if (count>=k) { head->next =revK(CURRENT, k); // 이제 카운트가 크거나 같으면 // 첫 번째 헤드를 다음 헤드에 연결합니다. } return newHead;}int main() { Node* head; for (int i =1; i <=5; i++) { head =push(head, i); } cout <<"원본 목록 :"; printDLL(헤드); cout <<"\n수정된 목록:"; 정수 k =3; 머리 =revK(머리, k); printDLL(헤드);} 출력
원본 목록 :1 2 3 4 5수정 목록 :3 2 1 5 4위 코드 설명
이 접근 방식에서 우리는 목록을 순회하고 카운트가 k보다 작을 때까지 순회합니다. 우리는 재귀 호출을 하고 그 값을 head -> next(여기서 우리는 단순히 목록을 반대로 하고 있지만 k에 도달하면 head가 다른 목록 k번째 요소를 가리키도록 해야 합니다. 예를 들어, 다음과 같은 경우 목록은 1 2 3 4 5이고 k는 3입니다. 여기서 중간 요소를 3 2 1로 바꾸지만 이제 1이 4를 가리키도록 해야 합니다. 그 요소도 반대로 될 것이기 때문에 재귀 호출 및 추가 if 문 만들기).
결론
이 기사에서는 재귀를 사용하여 주어진 크기의 그룹에서 이중 연결 목록을 뒤집는 문제를 해결합니다. . 우리는 또한 이 문제에 대한 C++ 프로그램과 우리가 해결한 완전한 접근 방식을 배웠습니다. C, Java, python 및 기타 언어와 같은 다른 언어로 동일한 프로그램을 작성할 수 있습니다. 이 기사가 도움이 되기를 바랍니다.