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

C++에서 연결 목록의 M 노드 다음에 N 노드를 삭제하시겠습니까?

<시간/>

데이터와 다음 노드에 대한 포인터를 포함하는 연결 목록을 먼저 정의합시다.

struct Node {
   int data;
   struct Node* next;
};

그런 다음 Node와 int 값에 대한 doublePointer를 사용하는 createList(Node ** headPtr, int new_data) 함수를 만듭니다. 함수 내에서 새로 생성된 노드 다음 포인터를 headptr에 할당한 다음 headptr을 새로 생성된 노드에 할당합니다.

void createList(Node ** headPtr, int new_data){
   Node* newNode = new Node();
   newNode->data = new_data;
   newNode->next = (*headPtr);
   (*headPtr) = newNode;
}

deleteNnodesAfterM(Node *head, int M, int N) 메서드는 루트 노드와 M 및 N 값을 사용합니다. 내부에서 헤드에 현재 Node*를 할당하고 Node *t도 선언합니다.

void deleteNnodesAfterM(Node *head, int M, int N){
   Node *current = head, *t;
   int nodeCount;

함수 내부에는 현재가 null을 가리키지 않는 동안 실행되는 while 루프가 있습니다. 첫 번째 for 루프는 M 반복 실행됩니다. 첫 번째 for 루프가 현재 실행을 마친 후 포인터는 연결 리스트에서 M 뒤의 노드를 가리킵니다. 그런 다음 노드 *t에는 삭제할 첫 번째 값인 current->next 값이 할당됩니다.

while (current){
   for (nodeCount = 1; nodeCount < M && current!= NULL; nodeCount++)
   current = current->next;
   if (current == NULL)
      return;
   t = current->next;

두 번째 for 루프는 N 반복 동안 실행되고 시작 위치에서 N 수의 노드를 해제합니다. 그런 다음 current->next가 t에 할당되고 t가 현재 노드가 됩니다.

for (nodeCount = 1; nodeCount<=N && t!= NULL; nodeCount++){
   Node *temp = t;
   t = t->next;
   free(temp);
}
current->next = t;
current = t;

마지막으로 헤드 포인터를 받는 printList(Node *head)는 연결 리스트를 출력합니다.

void printList(Node *head){
   Node *temp = head;
   while (temp != NULL){
      cout<<temp->data<<" ";
      temp = temp->next;
   }
   cout<<endl;
}

예시

연결 리스트의 M개 노드 이후에 N개의 노드를 삭제하는 다음 구현을 살펴보겠습니다. -

#include <iostream>
using namespace std;
struct Node{
   int data;
   Node *next;
};
void createList(Node ** headPtr, int new_data){
   Node* newNode = new Node();
   newNode->data = new_data;
   newNode->next = (*headPtr);
   (*headPtr) = newNode;
}
void printList(Node *head){
   Node *temp = head;
   while (temp != NULL){
      cout<<temp->data<<" ";
      temp = temp->next;
   }
   cout<<endl;
}
void deleteNnodesAfterM(Node *head, int M, int N){
   Node *current = head, *t;
   int nodeCount;
   while (current){
      for (nodeCount = 1; nodeCount < M && current!= NULL; nodeCount++)
      current = current->next;
      if (current == NULL)
      return;
      t = current->next;
      for (nodeCount = 1; nodeCount<=N && t!= NULL; nodeCount++){
         Node *temp = t;
         t = t->next;
         free(temp);
      }
      current->next = t;
      current = t;
   }
}
int main(){
   Node* head = NULL;
   int M=2, N=2;
   createList(&head, 2);
   createList(&head, 4);
   createList(&head, 6);
   createList(&head, 8);
   createList(&head, 10);
   createList(&head, 12);
   createList(&head, 14);
   cout << "M = " << M<< " N = " << N<<endl;
   cout<< "Original linked list :"<<endl;
   printList(head);
   deleteNnodesAfterM(head, M, N);
   cout<<"Linked list after deletion :"<<endl;
   printList(head);
   return 0;
}

출력

위의 코드는 다음 출력을 생성합니다 -

M = 2 N = 2

Original linked list :
14 12 10 8 6 4 2

Linked list after deletion :
14 12 6 4