Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับการหมุนในรายการที่เชื่อมโยงที่เรียงลำดับและหมุนใน C++


เราได้รับรายการที่เชื่อมโยง รายการจะถูกจัดเรียงก่อนแล้วจึงหมุนตามจำนวนโหนด K เป้าหมายคือการหาค่าของ K หากเราได้รับรายการเชื่อมโยงด้านล่างเป็นอินพุตซึ่งหมุนด้วยจำนวนโหนด K -

นับการหมุนในรายการที่เชื่อมโยงที่เรียงลำดับและหมุนใน C++

แล้วต้นฉบับต้องเป็น −

นับการหมุนในรายการที่เชื่อมโยงที่เรียงลำดับและหมุนใน C++

และเราสามารถเห็น K ที่นี่คือ 2 Input linked list คือการหมุนของ 2 nodes ในรายการ sorted linked list เดิม

ให้เราเข้าใจด้วยตัวอย่าง

ป้อนข้อมูล − รายการ :5 → 7 → 9 → 1 → 3

ผลผลิต

องค์ประกอบในรายการที่เชื่อมโยงคือ:5 7 9 1 3

จำนวนการหมุนในรายการเชื่อมโยงที่เรียงลำดับและหมุนคือ − 3

คำอธิบาย − เราสามารถรับรายการอินพุตหลังจากการหมุนสามครั้งในรายการเรียงดั้งเดิม

1 → 3 → 5 → 7 → 9, ต้นฉบับ 9 → 1 → 3 → 5 → 7, การหมุน 17 → 9 → 1 → 3 → 5 การหมุน 25 → 7 → 9 → 1 → 3 การหมุน 3

ป้อนข้อมูล − รายการ − 17 → 25 → 62 → 99

ผลผลิต

องค์ประกอบในรายการที่เชื่อมโยงคือ − 17 25 62 99

จำนวนการหมุนในรายการเชื่อมโยงที่เรียงลำดับและหมุนคือ − 4

คำอธิบาย − เราสามารถรับรายการอินพุตหลังจากการหมุนสี่รอบในรายการเรียงดั้งเดิม

17 → 25 → 62 → 99, original99 → 17 → 25 → 62, การหมุน 162 → 99 → 17 → 25, การหมุน 225 → 62 → 99 → 17, การหมุน 317 → 25 → 62 → 99 การหมุน 4 

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

อินพุตรายการที่เชื่อมโยงจะมีหนึ่งจุดที่โหนดถัดไปมีขนาดเล็กกว่าโหนดก่อนหน้า หากสตริงอินพุตถูกจัดเรียงด้วย จะเป็นการหมุนแบบเต็มของสตริงเดิม เริ่มต้นจากโหนดหลัก สำรวจจนถึง (ข้อมูลของโหนดปัจจุบัน> ข้อมูลของโหนดหลัก) และนับจำนวนที่เพิ่มขึ้น ในกรณีที่ (ข้อมูลของโหนดปัจจุบัน <ข้อมูลโหนดของโหนด) ทำลายการวนซ้ำ การนับจะมีจำนวนการหมุนในรายการดั้งเดิมเพื่อรับรายการอินพุต

  • นำรายการอินพุตและแทรกองค์ประกอบเข้าไป

  • ฟังก์ชัน insert_node(struct List_Node** head, int data) แทรกโหนดที่ส่วนหัวของรายการที่เชื่อมโยงโดยลำพังด้วยข้อมูล

  • พิมพ์ฟังก์ชัน (โหนด struct List_Node*) พิมพ์อินพุต รายการที่เชื่อมโยง เริ่มต้นจากส่วนหัวจนถึงจุดสิ้นสุดโดยใช้ while loop

  • การหมุนของฟังก์ชัน (struct List_Node* head) ใช้ตัวชี้ส่วนหัวของรายการที่เชื่อมโยงและส่งคืนจำนวนการหมุนที่ทำในรายการที่เชื่อมโยงดั้งเดิมเพื่อรับรายการที่เชื่อมโยงอินพุต

  • นับเริ่มต้นเป็น 0

  • ใช้ตัวแปร temp เป็นส่วนข้อมูลของโหนดหลัก

  • ใช้ while loop เลื่อนไปจนสุดรายการเชื่อมโยง (head!=NULL)

  • จำนวนที่เพิ่มขึ้นในกรณีที่ข้อมูลของโหนดปัจจุบันมากกว่าอุณหภูมิ

  • ในกรณีที่ข้อมูลของโหนดปัจจุบันน้อยกว่าข้อมูลของโหนดหลัก ( ชั่วคราว) แตก

  • เราจะนับจำนวนการหมุน

  • ผลตอบแทนนับเป็นผลลัพธ์

ตัวอย่าง

#include ใช้เนมสเปซ std;struct List_Node{ ข้อมูล int; โครงสร้าง List_Node* ถัดไป;};การหมุนแบบ int (โครงสร้าง List_Node* หัว) { จำนวน int =0; int temp =head->data; ในขณะที่ (หัว !=NULL){ ถ้า (ชั่วคราว> หัว->ข้อมูล){ แตก; } นับ++; หัว =หัว -> ถัดไป; } นับกลับ;} ถือเป็นโมฆะ insert_node (โครงสร้าง List_Node ** หัว, ข้อมูล int) { struct List_Node* new_node =ใหม่ List_Node; new_node->data =ข้อมูล; new_node->next =(*หัว); (*หัว) =new_node;}เป็นโมฆะพิมพ์(โครงสร้าง List_Node* โหนด){ ในขณะที่ (โหนด !=NULL){ cout<<โหนด->ข้อมูล<<" "; โหนด =โหนด -> ถัดไป; }}int main(){ โครงสร้าง List_Node* head =NULL; insert_node(&หัว, 2); insert_node(&หัว, 1); insert_node(&หัว, 18); insert_node(&หัว 35); insert_node(&หัว 28); cout<<"องค์ประกอบในรายการที่เชื่อมโยงคือ:"; พิมพ์(หัว); cout<<"\nจำนวนการหมุนในรายการเชื่อมโยงที่เรียงลำดับและหมุนแล้วคือ:"< 

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

องค์ประกอบในรายการเชื่อมโยงคือ:28 35 18 1 2จำนวนการหมุนในรายการเชื่อมโยงที่เรียงลำดับและหมุนแล้วคือ:2