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

ค้นหาโหนด Kth จากจุดสิ้นสุดในรายการเชื่อมโยงที่กำหนดโดยใช้ C++


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

ป้อนข้อมูล

1→2→3→4→7→8→9
K= 4

ผลผลิต

Node from the 4th Position is − 4

คำอธิบาย − เนื่องจากในรายการที่เชื่อมโยงโดยลำพังโหนด '4' จากจุดสิ้นสุดคือ '4' เราจะคืนค่าเอาต์พุตเป็น '4'

แนวทางการแก้ปัญหานี้

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

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

  • ฟังก์ชัน kthNodefromTheEnd(node*head, int pos) นำตัวชี้ไปยังโหนดหลักและตำแหน่งเป็นพารามิเตอร์และส่งกลับโหนดจากจุดสิ้นสุด

  • ลองใช้ตัวชี้สองตัวที่ "ช้า" และ "เร็ว" ซึ่งเริ่มแรกอยู่ที่หัว

  • วนซ้ำในรายการที่เชื่อมโยงและเลื่อนตัวชี้แบบเร็ว

  • เนื่องจากตัวชี้ "เร็ว" นั้นนำหน้า "ช้า" อยู่ 2 ก้าว ให้เราเลื่อนตัวชี้ทั้งสองไปจนกว่า "เร็ว" จะถึงจุดสิ้นสุด

  • ตอนนี้คืนค่าที่ช้าซึ่งชี้ไปที่โหนด k จากจุดสิ้นสุด

ตัวอย่าง

#include<iostream>
using namespace std;
class node{
public:
   int data;
   node*next;
   node(int d){
      data=d;
      next=NULL;
   }
};
void insertAthead(node*&head,int d){
   node*n= new node(d);
   n->next= head;
   head=n;
}
void printList(node*head){
   while(head!=NULL){
      cout<<head->data<<"-->";
      head= head->next;
   }
}
void kthFromtheEnd(node*head, int k){
   node*slow= head;
   node*fast= head;
   for(int i=0;i<k;i++){
      fast= fast->next;
   }
   while(fast!=NULL){
      slow= slow->next;
      fast= fast->next;
   }
   cout<<"Node from the "<<k<<"th position is"<<slow->data<<endl;
}
int main(){
   node*head= NULL;
   insertAthead(head,2);
   insertAthead(head,4);
   insertAthead(head,5);
   insertAthead(head,6);
   insertAthead(head,7);
   printList(head);
   cout<<endl;
   kthFromtheEnd(head,4);
   return 0;
}

ผลลัพธ์

การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น

Node from the 4th position is: 6

คำอธิบาย − รายการเชื่อมโยงที่กำหนดคือ 7→ 6→ 5→ 4→ 2→ และค่า kth คือ '4' ดังนั้นโหนดที่ 4 จากจุดสิ้นสุดคือ '6' ดังนั้นเราจะส่งคืน '6'