รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลเชิงเส้นที่มีหลายโหนดที่เชื่อมต่อถึงกัน แต่ละโหนดประกอบด้วยสองฟิลด์ ฟิลด์ข้อมูล และที่อยู่ของโหนดถัดไป สมมติว่าเราได้ให้รายการที่เชื่อมโยงโดยลำพัง ภารกิจคือการค้นหาโหนด 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'