一、 链表的创建
前面提到过,链表是由各个结点组成,而每个结点由数据和指针(存储地址)组成,下面上图供理解
该链表的实现是基于尾部插入,创建一个结构体指针,随着结点的创建总是指向最后一个结点
int n = 0, i = 0, data = 0;
scanf("%d", &n);
struct a* list = NULL;//如何找到这个链表,用list指向第一个结点
struct a* tail = NULL;//用tail指向链表的最后一个结点
for (i = 0; i < n; i++)
{
scanf("%d", &data);
struct a* after = (struct a*)malloc(sizeof(struct a));
after->data = data;
after->next = NULL;//每插入一个结点,把指针域赋为空指针;当为最后一个结点时,指针域为空指针
if (list == NULL)//将第一个结点的地址赋给list
{
list = after;
tail = after;
}
else//不为第一个结点时,在结点指针域后存入新结点地址
{
tail->next = after;//第一个结点的指针域放入下一个结点的地址
tail = after;//再将tail指向当前最后一个结点
}
}
在前文提到过具体方法:https://editor.csdn.net/md/?articleId=114953286
二、反转链表的创建
输入
{67,0,24,58}
打印值
[58,24,0,67]
如题要求,将链表的数据反过来打印。
查阅了些资料,大概有几种方法:
①栈实现,每经过一个结点时,把该结点放入一个栈中。
②把链表中结点的指针反转过来,改变链表的方向。
③以原链表中第一结点进行头部插入。
第一种方法暂时未学到(太菜了),第二种方法敲了半天不知道怎么实现(太菜。。),第三种方法可以一试。
解释如图:
有一点,最初的结点就变成最后一个结点,它的指针域赋为空指针。
头部插入代码实现如下:
struct a* after = list;
struct a* begin = list;
while (after->next)
{
after = after->next;//创建指针向后遍历结点,再赋给头部插入的结点。
struct a* before = (struct a*)malloc(sizeof(struct a));
before->next = list;
before->data = after->data;//老链表的值赋给新链表
list = before;
}
struct a* print = list;
while (print)
{
printf("%d ", print->data);
print = print->next;
}
这是很不错的一道题,第一种方法不改变结点,第二种方法改变了结点的指针域,第三种方法彻底重建了链表,差劲了。。