链表简述

来源:互联网 发布: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为头结点的单链表遍历。

很简单,当然,链表不止单链表,就是单链表在实际问题中应用起来也是有难度的。之后会有几个题目的例子。


0 0
原创粉丝点击