Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++를 사용하여 주어진 크기의 그룹에서 이중 연결 목록 반전

<시간/>

이 문제에서는 연결 리스트의 선두에 대한 포인터와 정수 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 및 기타 언어와 같은 다른 언어로 동일한 프로그램을 작성할 수 있습니다. 이 기사가 도움이 되기를 바랍니다.