声明:可以把向前挂车厢想象成把后一节车厢的地址赋值给前一车厢的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不是本来就等于null嘛,为什么要用if语句
{
Head=m1; //把第一节车厢先挂到车头先
End=m1; //现在只有这节车厢,所以他是尾车厢
}else //如果除了火车头还有其他车厢执行这里面的
{
m1->next=Head; //先把火车头后面的车厢挂到第一节车厢后面先 这里的head应该不是第一节车厢而是车头吗?
Head=m1; //再把整串火车挂回车头
}
Q:就想问问这里的head不是本来就等于null嘛,为什么要用if语句
A:就第一次是null,之后再插入就不是null了
Q:这里的head应该不是第一节车厢而是车头吗?
A:我感觉你理解头插法有点偏差,比如要插入1,2,3,4
第一次插入1:1(这是head)
第二次插入2:2,1(head就变成了2)
第三次插入3:3,2,1(head变成3了)
head是不断变化的
但是在这之前不是还没插入的嘛
我又看到了另外一种插入结点的方法,但还是看不懂。我觉得我可能哪里没理解到位
你觉得就上面这种我看的别人的写的插入链表的方法有没有问题呢?
@加油!!!: 没有问题,只不过插进去的是逆序,1,2,3,4,5依次头插法插入后变成了5,4,3,2,1
@加油!!!:
准确说这是一个可以不断调用的方法:
struct node
{
int num;
node* next;
};
(火车头)node* Head;
(火车尾)node* End;
(车厢1)node* m1;
(车厢2)node* m2;
//开始前链表只有火车头,后面没有车厢,车头也是车尾。
Head=End=NULL;
void HeadInsert(int number){ m1=new node; m1->next=NULL;
m1.num = number;//赋值,语法不知道对不对 if(Head==NULL) //如果只有火车头执行这里面的 就想问问这里的head不是本来就等于null嘛,为什么要用if语句 { Head=m1; //把第一节车厢先挂到车头先 End=m1; //现在只有这节车厢,所以他是尾车厢 }else //如果除了火车头还有其他车厢执行这里面的 { m1->next=Head; //新插入的节点的next指针指向Head Head=m1; //火车头指向新插入的车厢,换句话说:将新插入的车厢当做火车头了。 } }
//创建链表
//此时head为null
HeadInsert(1);//会走进if(Head==NULL){}里面去
//此时head为1
HeadInsert(2);/不会走进if(Head==NULL){}里面去了,以后也不会了,因为head不为null了
//此时head为2
HeadInsert(3);
//现在head为3
//得到的链表:3->2->1
@codingHeart: num是结点个数吗?
@加油!!!: num是当前节点的值
@codingHeart: 那么number呢?你的意思应该当只有一个结点时,就运行if后面的语句吧,然后当结点再增加,就运行else后的内容吧
@加油!!!: 嗯,number是每个节点你想赋予的值啊。你这得先把语言基础弄好点,再看数据结构的具体代码实现啊。
@codingHeart: 恩,我大体上懂了,等我自己在琢磨琢磨
你这个表示不对吧,如果要用车头举例,那么一开始应该Tail=Head = new node;
插入数据用Tail-next=m;
现在你这么写,只能这么理解,在车头加车厢后,车厢变车头
哎,我看的别人的,我也不懂,看不懂