数据结构与算法(1、数组和链表)

本文对比了数组和链表这两种数据结构的特点,详细解释了数组的高效查找特性和链表灵活的增删操作,并提供了链表创建的具体实例代码。此外还探讨了如何进行数组与链表中元素的翻转。

1、数组和链表
对于数组和链表而言,数组的每一个元素都有其对应的下标,例如

int array[]={1,2,3};
//array[1]=2;
/*
数组可以根据角标去查找元素,所以查找效率比较高,但是数组的增删非常不方便,因为需要移动大量的元素去实现增删
*/

链表:链表是弥补了数组的不足同时也有自己的缺点
链表的增删比较容易,但是失去了角标只能通过头结点一个一个去遍历

//链表的创建
//结构体的定义
struct node{
   int data;
   node* next;
}
//主函数
void main(){
node*head=NULL;
int i=0;
for(i;i<5;i++){
//接下来不停创建结点,然后赋值结点,最后结点连接有的结点
node* new_node=new node;
new_node->data=i;
new_node->next=head;
//继续
head=new_node;
}
}

怎么说呢,单链表的创建就是不停的获取新的结点,然后给结点赋值,同时给结点的link域,(指针域)赋值,让新结点指向老结点,最后将新结点变成头结点。
如果仔细观察,可以发现这个实际上是倒序增加结点的。
问题来了,如何翻转数组以及链表中的元素呢?

数据结构数组链表存在多方面的区别: ### 存储特性 - **内存连续性**:数组在内存中是一块连续的区域,要求有足够的连续内存空间;而链表在内存中可以存在于任何地方,不要求连续,链表节点的存储单元在执行时动态向系统申请[^1]。 - **空间分配**:数组元素个数是固定的,需要预留空间,在使用前要先申请内存大小,可能会浪费内存空间;链表的结点个数可按需要增减,空间不需要提前指定大小,是动态申请的,根据需求动态地申请删除内存空间,扩展方便,空间利用率较高[^1][4]。 ### 元素关系 - **顺序确定方式**:数组元素的顺序关系由元素数组中的位置(即下标)确定;链表中的节点关系由节点所包含的指针来体现,每个节点包含存储数据元素的数据域存储下一个结点地址的指针域[^1][2]。 ### 操作效率 - **插入删除操作**:对于数组,插入删除数据效率低,插入数据时,该位置后面的数据在内存中要向后移;而链表任意位置插入元素删除元素效率较高,时间复杂度为O(1),增删数据容易,程序结构更清晰,处理方法也比较简便[^1][4]。 - **查找操作**:数组的随机读取率很高,因为数组是连续的,知道每一个数据的内存地址,可以直接找到给定地址的数据;链表查找数据时效率低,因为不具有随机访问性,必须从第一个开始遍历,查找一个节点或者访问特定编号的节点需要O(n)的时间,而数组相应的时间复杂度为O(1) [^1][2]。 ### 代码示例 以下是Python中简单的数组(使用列表模拟)链表的操作示例: ```python # 数组操作示例 array = [1, 2, 3, 4, 5] # 插入操作 array.insert(2, 6) # 删除操作 del array[3] print(array) # 链表节点类定义 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 链表操作示例 # 创建链表 1 -> 2 -> 3 head = ListNode(1) head.next = ListNode(2) head.next.next = ListNode(3) # 插入操作,在第二个节点后插入一个值为4的节点 new_node = ListNode(4) new_node.next = head.next.next head.next.next = new_node # 删除操作,删除第二个节点 head.next = head.next.next # 遍历链表 current = head while current: print(current.val, end=" -> " if current.next else "\n") current = current.next ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值