链表简述
来源:互联网 发布:json转换java对象 编辑:程序博客网 时间:2024/05/22 05:12
其实学习编程的时候,一开始差不多都是先写出“hello, world”,其后就开始接触数组了,因为使用计算机完成计算的一个重大优势就是可以进行批量处理(想一想用手算或者使用普通计算器是做不到这一点的),而将要处理的数据存储在一个数组里面就实现了这种功能。数组是最基本的数据结构,他是顺序存储数据的,也就是说,每个数据在数组当中都有一个隐含的索引(基本上都是从0开始的所谓数组的下标),下标加上数据本身,这种结构就基本能满足我们正常数据处理所遇到的的大多数问题。但是这样的结构由两个缺点:
1. 当数据频繁地进出数组时,每添加或者删除一个元素,就会导致这个元素之后部分的数组发生改变,这是低效的
2. 随着信息时代的进步,数组越来越多的时候不能满足于算法的需求。
所以,链表的出现,就极大程度上解决了数据的添加删除的问题,而基于链表结构之上,树和图的出现又开拓了算法设计的空间。
下面,我将用较长的一段时间,就这三种数据结构的基本操作,以及先关题目做讲解。可能会有好多节的内容。先说链表吧。
链表也是一种顺序结构,不过顺序不是由一个自然的索引提供的,而是由它本身节点的指向关系决定。它可以看做是有很多叫做“节点”的元素构成的。节点是计算机分配的一块内存,内存里面放了两个东西:值和地址。这一点看对于链表类的定义就能知道:
class ListNode: def __init__(self, x): self.val = x self.next = None值存储的是数据,而地址存储的则是这个节点的下一个节点在内存中所在的位置,这个地址,一般用"next"字符表示,好理解嘛。
我们把这样的结构叫做单链表:1->2->3->4->None.第一个节点存储了数字1,保存的地址所代表的位置的节点存储了数字2,同时存储2的这个节点也存了一个地址,这个地址是第三个节点所在的位置。可以将链表理解成一个个的房子,里面都住着一个人(值),同时这个人手上有一个字条,上面写者:他的下家住的地方(地址)。而单链表则有如下特点:
1. 每个人手上只有一张字条(只存储一个地址),并且字条的内容不会重复(不会有两不同个节点的下一个节点是一样的)
2. 最后那个人手上的字条为空(尾节点存储的地址是空)。
这样,我们就可以写出简单的链表操作了:
class ListNode: def __init__(self, x): self.val = x self.next = Nonenew_node = ListNode(x)def add(pre, cur, new_node):pre.next = new_nodenew_node.next = curdef delete(pre, cur):pre.next = cur.nextdef traverse(head):while head:print(head.val)head = head.next第6行是新建一个值为x的节点,add函数实现的功能是在pre和cur两个节点之间插入一个新的节点,其中pre是cur的前驱(就是cur之前的那个节点是pre);delete函数是实现删除cur,其中,pre是cur的前驱;traverse函数是对以head为头结点的单链表遍历。
很简单,当然,链表不止单链表,就是单链表在实际问题中应用起来也是有难度的。之后会有几个题目的例子。
- 链表简述
- 链表简述
- 简述数组和链表的区别
- 简述数组和链表的区别
- 原型链机制简述
- 虚表之简述
- 简述表值函数
- 广义表简述
- Hive 表类型简述
- 线性表简述
- 线性表简述
- 线性表之静态链表(简述)
- IOS事件响应者链简述
- Blockchian区块链:IBM HyperLedger fabric 简述
- 简述区块链架构设计,通俗易懂
- 简述区块链架构设计,通俗易懂
- MCS-51指令功能简述表
- MCS-51指令功能简述表
- js解析websocket二进制数据包
- php 随机读取一维数组的一个或多个元素
- bootstrap弹出模态框滚动条问题
- FMDB详解
- Android_完全退出
- 链表简述
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 A-喝酒【模拟】
- 单例模式
- Echarts的使用和学习心得体会
- PAT-B 1013. 数素数
- CSS3三维相册
- 解读(五):分析KeyboardFragment, 带文字和表情的评论发表面板
- 命令行修改root密码
- 科学美国人60秒:熊狸的气味闻起来就像奶油爆米花 科学家或揭开其中奥秘