链表
-
什么是链表?
-
举个例子,玩侦探游戏,首先给你一个线索,钥匙,这又指向下一个线索——你必须找到一个锁,找到锁以后,又指向下一个线索——锁是为了锁什么东西……最后找到出口,可以简单看成下图。
-
-
由此可见列表是由一个结构体数组组成的,有两个成员——1,value指这个节点本来存的值.2,next表示指向下一个节点的地址,这两个叫做数据域和指针域,单项列表最开头为"head"指向第一个节点的value,最后一个结点的next为"NULL"——空地址,链表结束,但也有循环列表最后节点指向第一个节点。
-
链表定义
struct node
{
int value;//每个结点存的值
int next;//下一个节点的地址
}a[10000];//里面是链表的长度
比如(循环列表)
还有(单向列表)
-
这个列表表示的是”6,7,5,8.
那就有问题,一个普通的数组也可以完成这个工作,为什么还要用更复杂的链表。 -
那就说到链表的优点,学数组时有一道"操作数组"——完成数组的插入,删除,等工作。思路是在应插入的位置以后,数均往后移动一位,腾出位置让数进入数组,删除也一样,直接让应该删除后面的数均往前移动一位。这样的话,效率非常的慢。但链表在插入,删除,可比数组好用太多了。
-
比如,我要删掉第二个结点,就只需要把结点1next的值变成结点2next的值。
如图
-
没有指向结点2的指针,从头遍历一遍,第二个结点就被删除了,这个链表就变成了6,5,8,空间复杂度仅为o(1),节省大量时间;
-
插入也是同理
如图 -
删除代码
a[m-1].next=a[m].next;//删除结点m;
- 插入代码
n++;//n为链表结点个数++是为了再开一个链表存将要插入的value和next
a[n].value=mn;//mn为要插入的数,存入新结点的value;
a[n].next=a[m].next;//在m后面插入新结点,这里让新结点的next指向了原m+1的value
a[m].next=a[n-1].next;//让m的next指向n;
- 遍历代码
int t=1;
for(int i=1;i<=n;i++)//输出n次
{
cout<<a[t].value;//输出数字域
t=a[t].next;//指针往下一个指
}
- 以上就是关于链表简单的几种操作,关于链表一般不要用,当题目需要插入,删除时再用,因为链表比线性表多了指针域,空间要大很多。