Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++를 사용하여 주어진 단일 연결 목록에서 꼬리 노드 삭제

<시간/>

연결 목록은 노드를 포함하는 선형 데이터 구조이며 각 노드에는 두 개의 필드가 있습니다. 하나는 삽입할 값 또는 데이터이고 다른 필드는 다음 노드의 주소를 저장합니다.

여기서 우리의 임무는 연결 목록의 끝에서 노드를 삭제하는 것입니다. 마지막 노드는 꼬리 노드로 알려져 있습니다. 연결 목록에 노드가 없으면 NULL을 반환합니다.

예를 들어 -

입력 1 − 1 → 2 → 3 → 4 → 5

출력 - 1 → 2 → 3 → 4 →

설명 − 주어진 단일 연결 리스트에서 끝에서 오는 노드는 '5'입니다. 마지막 노드를 삭제하면 1 → 2 → 3 → 4 →가 출력됩니다.

입력 2 − 5 → 8 →3

출력 − 5 → 8 →

설명 - 주어진 단일 연결 리스트에서 끝에서 오는 노드는 '3'이다. 끝에서 노드를 삭제하면 출력은 5 →8 →.

가 됩니다.

이 문제를 해결하기 위한 접근 방식

이 특정 문제를 해결하는 간단한 방법은 현재 포인터가 연결 목록의 마지막 노드를 가리킬 때 나중에 현재 노드의 값을 저장하는 이전 노드를 만드는 것입니다.

현재 노드가 마지막 노드를 가리키는 경우 연결 목록의 모든 노드를 반복합니다. 마지막으로 연결 목록에서 돌아옵니다.

  • 노드를 삽입하여 연결 목록을 초기화합니다.

  • insertAtFirst(node*&head, int data) 함수는 연결 리스트의 모든 노드를 삽입합니다.

  • 함수 deleteAtTail(node*head)은 현재 머리를 가리키는 포인터를 취합니다.

  • 이전 노드 포인터를 생성하고 NULL로 초기화합니다.

  • 현재 포인터의 헤드를 가리키는 임시 노드 포인터를 만듭니다.

  • 연결 목록의 끝에 도달하지 않을 때까지 임시 포인터를 탐색합니다.

  • 임시 포인터의 값을 이전 노드 포인터에 저장합니다.

  • 임시 포인터를 삭제합니다.

  • 연결 목록을 반환합니다.

예시

#include네임스페이스 std;class node 사용{ public:int data; 노드*다음; 노드(int d){ 데이터=d; 노드*다음=NULL; }}; 무효 insertAtFirst(노드*&head, int 데이터){ 노드*n=새 노드(데이터); n->다음=머리; head=n;} 무효 printNode(node*head){ while(head!=NULL){ cout<data<<"->"; 머리=머리->다음; } cout<next!=NULL){ 이전=임시; 임시 =임시 -> 다음; } 임시 삭제; 이전->다음=NULL; return;}int main(){ 노드*헤드=NULL; insertAtFirst(머리,5); insertAtFirst(머리,4); insertAtFirst(머리,3); insertAtFirst(머리,2); insertAtFirst(머리, 1); 꼬리말 삭제(머리); printNode(헤드);}

출력

위의 코드를 실행하면 출력이 다음과 같이 생성됩니다.

<전>1→2→3→4→

주어진 단일 연결 리스트 1 → 2 → 3 → 4 → 5에서 연결 리스트의 마지막 노드는 '5'입니다. 따라서 마지막 노드를 삭제한 후 연결 리스트는 1 → 2 → 3 → 4 →가 됩니다.