声明:可以把向前挂车厢想象成把后一节车厢的地址赋值给前一车厢的next指针。
首先,我们把链表的节点比喻成火车的车厢。每节车厢的前面都有一个钩子,我们把这想想成指针,他用来连接上一节车厢。
接着,使用尾插法的话,也就是先要找到火车尾,即链表的尾指针。然后把自己要加进去的车厢挂到火车的最后面。最后标记这节车厢为火车尾(把地址赋值给尾指针)。
使用头插法的话,就是先找到火车头,即链表的头指针。然后把头指针后面的那节车厢挂到你要插入链表的那节车厢的后面。最后在把插入链表的那节车厢挂到火车头去(把地址赋值给头指针)。
举例:
(火车车厢)
struct node
{
int num;
node* next;
};
(火车头)node* Head;
(火车尾)node* End;
(车厢1)node* m1;
(车厢2)node* m2;
//开始前链表只有火车头,后面没有车厢,车头也是车尾。
Head=End=NULL;
//1.头插法
//申请车厢1
m1=new node;
m1->next=NULL;
if(Head==NULL) //如果只有火车头执行这里面的
{
Head=m1; //把第一节车厢先挂到车头先
End=m1; //现在只有这节车厢,所以他是尾车厢
}else //如果除了火车头还有其他车厢执行这里面的
{
m1->next=Head; //先把火车头后面的车厢挂到第一节车厢后面先
Head=m1; //再把整串火车挂回车头
}
//2.尾插法
//申请车厢2
m2=new node;
m2->next=NULL;
if(Head==NULL) //如果只有火车头执行这里面的
{
Head=m2; //把第一节车厢先挂到车头先
End=m2; //现在只有这节车厢,所以他是尾车厢
}else //如果除了火车头还有其他车厢执行这里面的
{
End->next=m2; //把车厢挂到车尾去
End=m2; //标记这节车厢是车尾
}
链表的删除
1. 判断删除的节点是否是首节点:
2. 判断第二个节点是否为空节点;
3. 循环遍历节点找出需要删除的节点
删除链表:先“连”再“断”
void delete1(book *head, int num)
{
book *l;
//删除的节点为头节点;
if (head->num==num)
{
l=head; //先连;
head=head->next; //先连;
::head=head;
delete l; //之后断开;
cout<<"success"<<endl;
}
while (head)
{
if (head->next==NULL)
{
cout<<"Can't find the node!(inside while)"<<endl;
}
//删除的节点为中间或者其他节点;
if (head->num==num)
{
l=head->next; //定位要删除的节点,连接;
head->next=l->next; //连接;
delete l; //删除节点;
cout<<"success"<<endl;
}
head=head->next;
}
cout<<"Can't find the node!(outside while)"<<endl;
}
附图:形象好理解!