1、什么是链表?
链表是一种动态的数据结构,链表中的每一个元素代表一个节点,每一个节点都由数据和指针。跟数组不同链表不用预先定义大小,而且硬件支持的话可以无限扩展。
2、链表与列表的区别
1、数组需要预先定义大小,无法适应数据动态地增减,数据小于定义的长度会浪费内存,数据超过预定义的长度无法插入。而链表是动态增删数据,可以随意增加。
2、数组适用于获取元素的操作,直接get索引即可,链表对于获取元素比较麻烦需要从头一直寻找,但是适用与增删,直接修改节点的指向即可,但是对于数组就比较麻烦了,例如[1,2,3,4]需要在下标为1的位置插入-2,则需要将[2,3,4]后移,赋值ls[1]=-2
3、数组从栈中分配空间, 对于程序员方便快速,但自由度小。链表从堆中分配空间, 自由度大但申请管理比较麻烦.
3、链表分类
链表分为:单链表、循环链表(又可以分为带头结点的单链表、不带头结点的单链表--但是一般来说操作带头结点或者带为尾节点,操作数据更加方便)
1 class SingleNode: 2 def __init__(self, info): 3 self.info = info ##数据 4 self.next = None ##指针 5 6 class SingleNodeList: 7 def __init__(self): 8 #定义一个链表头 9 self.head = None 10 11 def is_empty(self): 12 '''链表是否为空''' 13 if self.head == None: ##头结点为空 14 return True 15 else: 16 return False 17 18 def length(self): 19 '''链表长度''' 20 if self.head == None: 21 return 0 22 count = 1 23 node = self.head 24 while node.next != None: 25 count += 1 26 node = node.next ##移动指针 27 28 return count ##返回数据 29 30 def travel(self): 31 '''遍历链表''' 32 if self.head == None: 33 print('None') 34 node = self.head 35 print(node.info) ##输出第一个节点的数据 36 while node.next != None: 37 node = node.next 38 print(node.info)
在链表头部插入元素:
1 def add(self, item):
''' 在头结点加入一个节点''' 2 newNode = SingleNode(item) ##创建一个新节点 3 if self.head == None: ##链表为空 4 self.head = newNode 5 return 6 ##链表不为空 7 newNode.next = self.head ##把现在头结点的地址给新节点的next 8 self.head = newNode ## 把新节点的大地址,给头结点
1 def append(self, item): 2 '''尾部追加数据''' 3 newNode = SingleNode(item) ## 新节点 4 node = self.head 5 if self.head == None: 6 newNode = self.head ##放在头部 7 return 8 else: 9 while node.next != None: 10 node = node.next 11 node.next = newNode
1 def insert(self, pos, item): 2 #相当于在链表头插入元素 3 if pos <= 0: 4 self.add(item) 5 return 6 #如果pos比长度还大,相当于在尾部追加 7 if pos > self.length() - 1: 8 self.append(item) 9 return 10 11 temp = 1 12 #pre表示上一个节点 13 pre = self.head 14 while temp != pos: 15 temp += 1 16 pre = pre.next 17 18 newNode = SingleNode(item) 19 20 newNode.next = pre.next 21 pre.next = newNode
有生之年,只诉衷肠不言殇.....