연결 목록은 서로 연결된 여러 노드가 있는 선형 데이터 구조입니다. 각 노드는 두 개의 필드 데이터 필드와 다음 노드의 주소로 구성됩니다. 단일 연결 목록에 주어진 단일 연결 목록의 끝에서 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'입니다. 따라서 끝에서 네 번째 노드는 '6'이므로 '6'을 반환합니다.