使用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<iostream>
using namespace std;
class node{
   public:
   int data;
   node*next;
   node(int d){
      data=d;
      node*next= NULL;
   }
};
void insertAtFirst(node*&head, int data){
   node*n= new node(data);
   n->next= head;
   head=n;
}
void printNode(node*head){
   while(head!=NULL){
      cout<<head->data<<"->";
      head=head->next;
   }
   cout<<endl;
}
void deleteatTail(node*head){
   node*prev= NULL;
   node*temp= head;
   while(temp->next!=NULL){
      prev= temp;
      temp=temp->next;
   }
   delete temp;
   prev->next= NULL;
   return;
}
int main(){
   node*head= NULL;
   insertAtFirst(head,5);
   insertAtFirst(head,4);
   insertAtFirst(head,3);
   insertAtFirst(head,2);
   insertAtFirst(head,1);
   deleteatTail(head);
   printNode(head);
}

输出

运行以上代码将生成以下输出:

1→2→3→4→

在给定的输入单链表1 → 2 → 3 → 4 → 5中,链表的最后一个节点是‘5’。因此,删除最后一个节点后,链表将变为1 → 2 → 3 → 4 →。

更新于:2021年2月5日

2K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告