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

 

posted on 2018-03-20 21:28  虫子小孩  阅读(102)  评论(0编辑  收藏  举报