之前一直习惯用尾插法,因为尾插法更符合我自己的逻辑,每次看到别人使用头插法的时候也不是不能理解,就是感觉不舒服,今天再次来复习一下头插法和尾插法,
1.头插法
故名思议,从链表头部不断插入,然后将头指针不断后移,这样插入导致的结果就是输出的时候和输入的顺序相反。
头指针被只是被声明,开辟了一个四个字节的指针变量用来存地址,在头插法中,这个是头指针,而在尾插法中,我更愿意认识是头结点。因为在尾插法中我们用头结点的指针域不断的去存下一个节点的地址。
下面给出头插法的代码
PNODE creat()
{
PNODE Head=NULL;
int n,i,val;
cout<<"请输入链表长度:";
cin>>n;
for(i=0;i<n;i++)
{
PNODE pNew=new NODE;//开辟新节点
cout<<"请输入第"<<i+1<<"个节点的值:";
cin>>val;
pNew->data=val;//将值存入数据域
//头插
pNew->pNext=Head;
Head=pNew;
}
return Head;
}
在尾插法中,会多出来一个节点,这个节点就是头节点,它是一个结构体指针变量,用指针域存下一个节点的起始位置,在逻辑思维上,我更习惯这个尾插法。
//尾插
PNODE creat()//尾插法
{
PNODE Head=new NODE;//造一个头节点
PNODE Tail=Head;
Tail->pNext=NULL;//现在尾节点和头节点重合,但是它的指针域指向NULL
int n,i,val;
cout<<"请输入链表长度:";
cin>>n;
for(i=0;i<n;i++)
{
PNODE pNew=new NODE;//开辟新节点
cout<<"请输入第"<<i+1<<"个节点的值:";
cin>>val;
pNew->data=val;//将值存入数据域
//尾插
Tail->pNext=pNew;//将新产生的节点挂在尾部
pNew->pNext=NULL;
Tail=pNew;//尾指针后移
}
return Head;
}
尾插法起始多开辟了一个头节点,所以说遍历的时候和头插法也稍微有区别。
下面给出完整代码
//再次理解头插和尾插
#include"bits/stdc++.h"
using namespace std;
typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE;
PNODE creat_1()
{
PNODE Head=NULL;
int n,i,val;
cout<<"请输入链表长度:";
cin>>n;
for(i=0;i<n;i++)
{
PNODE pNew=new NODE;//开辟新节点
cout<<"请输入第"<<i+1<<"个节点的值:";
cin>>val;
pNew->data=val;//将值存入数据域
//头插
pNew->pNext=Head;
Head=pNew;
}
return Head;
}
void show_1(PNODE Head)//头插
{
PNODE p=Head;
while(p!=NULL){cout<<p->data<<"\t";p=p->pNext;}
}
PNODE creat_2()//尾插法
{
PNODE Head=new NODE;//造一个头节点
PNODE Tail=Head;
Tail->pNext=NULL;//现在尾节点和头节点重合,但是它的指针域指向NULL
int n,i,val;
cout<<"请输入链表长度:";
cin>>n;
for(i=0;i<n;i++)
{
PNODE pNew=new NODE;//开辟新节点
cout<<"请输入第"<<i+1<<"个节点的值:";
cin>>val;
pNew->data=val;//将值存入数据域
//尾插
Tail->pNext=pNew;//将新产生的节点挂在尾部
pNew->pNext=NULL;
Tail=pNew;//尾指针后移
}
return Head;
}
void show_2(PNODE Head)//尾插
{
PNODE p=Head->pNext;
while(p!=NULL){cout<<p->data<<"\t";p=p->pNext;}
}
int main()
{
//头插法建立链表
cout<<"*****头插法建立*****"<<endl;
PNODE Head_1=creat_1();
show_1(Head_1);
//尾插法建立链表
cout<<"\n*****尾插法建立*****"<<endl;
PNODE Head_2=creat_2();
show_2(Head_2);
return 0;
}
在以上代码中,头插法并没有使用头结点(含指针域和数据域),而是用了一个头指针,这样可能会导致后面的操作出错,如,当删除第一个节点时,如果没有头节点,可能丢失掉整个链表。
来源:CSDN
作者:weixin_43615816
链接:https://blog.csdn.net/weixin_43615816/article/details/103632263