ขั้นแรกให้เรากำหนดรายการเชื่อมโยงที่มีข้อมูลและตัวชี้ไปยังโหนดถัดไป
struct Node { int data; struct Node* next; };
จากนั้นเราสร้างฟังก์ชัน createList(Node ** headPtr, int new_data) ซึ่งนำ doublePointer ไปยังโหนดและค่า int ภายในฟังก์ชันเรากำหนดโหนดที่สร้างขึ้นใหม่ตัวชี้ถัดไปให้กับ 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;
ภายในฟังก์ชันเรามี while loop ซึ่งทำงานในขณะที่กระแสไม่ชี้ไปที่ค่าว่าง ครั้งแรกสำหรับลูปรันสำหรับการวนซ้ำ M หลังจากลูปแรกเสร็จสิ้นการดำเนินการ ปัจจุบัน ตัวชี้ชี้ไปที่โหนดหลัง M ในรายการที่เชื่อมโยง จากนั้นโหนด *t จะถูกกำหนดค่าปัจจุบัน -> ถัดไป ซึ่งเป็นค่าแรกที่จะลบ
while (current){ for (nodeCount = 1; nodeCount < M && current!= NULL; nodeCount++) current = current->next; if (current == NULL) return; t = current->next;
วินาทีสำหรับลูปรันสำหรับการวนซ้ำ N และทำให้จำนวนโหนด N ว่างจากตำแหน่งเริ่มต้น ปัจจุบัน -> ถัดไปถูกกำหนดให้กับ 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; }
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อลบโหนด N หลังจากโหนด M ของรายการที่เชื่อมโยง -
#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