链表基础知识:
链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。尽管两种结构都可以用来存储一系列的数据,但又各有各的特点。
数组的优势,在于可以方便的遍历查找需要的数据。在查询数组指定位置(如查询数组中的第4个数据)的操作中,只需要进行1次操作即可,时间复杂度为O(1)。但是,这种时间上的便利性,是因为数组在内存中占用了连续的空间,在进行类似的查找或者遍历时,本质是指针在内存中的定向偏移。然而,当需要对数组成员进行添加和删除的操作时,数组内完成这类操作的时间复杂度则变成了O(n)。
链表的特性,使其在某些操作上比数组更加高效。例如当进行插入和删除操作时,链表操作的时间复杂度仅为O(1)。另外,因为链表在内存中不是连续存储的,所以可以充分利用内存中的碎片空间。除此之外,链表还是很多算法的基础,最常见的哈希表就是基于链表来实现的。基于以上原因,我们可以看到,链表在程序设计过程中是非常重要的。本文总结了我们在学习链表的过程中碰到的问题和体会。
链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序。每个结构含有表元素和指向后继元素的指针。最后一个单元的指针指向NULL。为了方便链表的删除与插入操作,可以为链表添加一个表头。
删除操作可以通过修改一个指针来实现。
插入操作需要执行两次指针调整。
手动实现一个单向链表:
class Node:
def __init__(self,item):
self.item = item
self.next = None
a=Node(1)
b=Node(2)
c=Node(3)
a.next = b
b.next = c
print(a.next.next.item)
链表的创建和遍历
class Node:
def __init__(self,item):
self.item = item
self.next = None
def create_linklist(li): #头插法
head = Node(li[0]) # 头部第一个
for element in li[1:]:
node =Node(element)
node.next = head #新来的连上上一个
head = node
return head
def create_linklist_tail(li):
head = Node(li[0])
tail = head
for element in li[1:]:
node = Node(element)
tail.next = node #在链表尾部顺序插入li
tail = node
return head
def print_linklist(lk):
while lk:
print(lk.item,end=',')
lk = lk.next
lk = create_linklist([1,2,3])
print_linklist(lk)
print('')
lk = create_linklist_tail([1,2,3])
print_linklist(lk)