使用 C++ 查詢給定單鏈表中從末尾開始的第 K 個節點
連結串列是一種線性資料結構,包含多個相互連線的節點。每個節點包含兩個欄位:資料欄位和下一個節點的地址。假設我們給定一個單鏈表,任務是找到給定單鏈表中從末尾開始的第 k 個節點。例如:
輸入 -
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) 以指向頭節點的指標和位置作為引數,並返回從末尾開始的節點。
讓我們使用兩個指標“慢指標”和“快指標”,它們最初都在頭部。
遍歷連結串列並移動快指標。
由於“快指標”比“慢指標”領先兩步,因此讓我們移動這兩個指標,直到“快指標”到達末尾。
現在返回慢指標處的值,該指標指向從末尾開始的第 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→,第 k 個值為“4”。因此,從末尾開始的第 4 個節點是“6”,因此我們將返回“6”。
廣告