首页 新闻 会员 周边

关于链表的几个问题

0
悬赏园豆:5 [已解决问题] 解决于 2017-04-20 19:50
声明:可以把向前挂车厢想象成把后一节车厢的地址赋值给前一车厢的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; //再把整串火车挂回车头
}


加油!!!的主页 加油!!! | 初学一级 | 园豆:199
提问于:2017-04-20 12:24
< >
分享
最佳答案
1

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是不断变化的

收获园豆:5
codingHeart | 小虾三级 |园豆:1511 | 2017-04-20 13:49

但是在这之前不是还没插入的嘛

加油!!! | 园豆:199 (初学一级) | 2017-04-20 15:29

我又看到了另外一种插入结点的方法,但还是看不懂。我觉得我可能哪里没理解到位

加油!!! | 园豆:199 (初学一级) | 2017-04-20 15:32

你觉得就上面这种我看的别人的写的插入链表的方法有没有问题呢?

加油!!! | 园豆:199 (初学一级) | 2017-04-20 15:36

@加油!!!: 没有问题,只不过插进去的是逆序,1,2,3,4,5依次头插法插入后变成了5,4,3,2,1

codingHeart | 园豆:1511 (小虾三级) | 2017-04-20 16:19

@加油!!!:

准确说这是一个可以不断调用的方法:

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 | 园豆:1511 (小虾三级) | 2017-04-20 16:31

@codingHeart: num是结点个数吗?

加油!!! | 园豆:199 (初学一级) | 2017-04-20 17:39

@加油!!!: num是当前节点的值

codingHeart | 园豆:1511 (小虾三级) | 2017-04-20 18:59

@codingHeart: 那么number呢?你的意思应该当只有一个结点时,就运行if后面的语句吧,然后当结点再增加,就运行else后的内容吧

加油!!! | 园豆:199 (初学一级) | 2017-04-20 19:10

@加油!!!: 嗯,number是每个节点你想赋予的值啊。你这得先把语言基础弄好点,再看数据结构的具体代码实现啊。

codingHeart | 园豆:1511 (小虾三级) | 2017-04-20 19:18

@codingHeart: 恩,我大体上懂了,等我自己在琢磨琢磨

加油!!! | 园豆:199 (初学一级) | 2017-04-20 19:50
其他回答(1)
0

你这个表示不对吧,如果要用车头举例,那么一开始应该Tail=Head = new node;

插入数据用Tail-next=m;

 

现在你这么写,只能这么理解,在车头加车厢后,车厢变车头

狼爷 | 园豆:1204 (小虾三级) | 2017-04-20 13:38

哎,我看的别人的,我也不懂,看不懂

支持(0) 反对(0) 加油!!! | 园豆:199 (初学一级) | 2017-04-20 15:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册