python实现链表

3.6列表

列表是元素的集合,其中每一个元素都有一个相对于其他元素的位置。更具体地说,这种列表称为无序列表。

3.6.1 无序列表的抽象数据类型

以下是无序列表的操作:

  • List():创建一个空列表,他需要参数,返回一个空列表
  • add(item):头插
  • remove(item):移除元素item
  • search(item):搜索元素item是否在链表里,返回一个boolean对象
  • isEmpty():判断是否为空
  • length():求元素的个数
  • append(item):尾插
  • index(item):返回item的下标
  • insert(pos, item):在指定位置pos插入元素item
  • pop():假设列表不为空并移除最后一个元素,并将该元素返回
  • pop(pos):移除制定位置的元素并返回

3.6.2 实现无序列表:链表

为了实现无序列表我们要构建链表。无序列表需要维持元素之间的相对位置,但是并不需要在连续的内存空间中维护这些位置信息。需要注意的是,必须指明列表中第一个元素的位置,一旦知道第一个元素的位置就能根据链接信息推出后续元素的位置。指向链表第一个元素的引用被称作***头***。最后一个元素需要知道自己没有下一个元素。

      
"""
节点node是构建链表的基本数据结构。每一个节点对象都必须至少持有两份信息:
   -1.节点必须包含列表元素,我们称之为节点的数据变量。
   -2.节点必须保存指向下一个节点的引用。
"""

class Node:
   def __init__(self, initdata):
       self.data = initdata
       self.next = None

   def getData(self):
       return self.data

   def getNext(self):
       return self.next

   def setData(self, newdata):
       self.data = newdata

   def setNext(self, newnext):
       self.next = newnext



class UnorderedList:

   def __init__(self):
       self.head = None #注意每一个列表都保存了指向列表头部的引用
       #非常重要的一点是:列表类本身并不包含任何节点对象,而只有指向整个链表结构中第一个节点的引用

   def isEmpty(self):
       return self.head == None

   def add(self, item):
       temp = Node(item) #创建一个新节点,列表中的每一个元素都必须放在一个节点对象中
       #将新节点与已有链表连接起来这一过程需要两部:
       #step1:将新节点的next引用指向当前链表的第一个节点
       temp.setNext(self.head)
       #step2:修改链表的头节点使其指向新建的节点
       self.head = temp
       #上述两部顺序非常重要,如果颠倒顺序所有节点都将丢失无法访问

   def length(self):
       current = self.head
       count = 0
       while current != None:
           count += 1
           current = current.getNext()

       return count

   def search(self, item):
       current = self.head
       found = False
       while current != None and not found:
           if current.getData() == item:
               found = True
           else:
               current = current.getNext()

       return found

   def remove(self, item):
       current = self.head
       previous = None
       found = False
       while not found:
           if current.getData() == item:
               found = True
           else:
               previous = current
               current = current.getNext()

       if previous == None:
           self.head = current.getNext()
       else:
           previous.setNext(current.getNext())

   def append(self, item):
       last = Node(item)
       found = False
       current = self.head
       while not found:
           if current.getNext() == None:
               found = True
           else:
               current = current.getNext()

       current.setNext(last)

   def insert(self, position, item):
       node = Node(item)
       found = False
       current = self.head
       previous = None
       count = 0

       while not found:
           if count == position:
               found = True
           else:
               previous = current
               current = current.getNext()
               count += 1

       if previous == None:
           node.setNext(self.head)
           self.head = node
       else:
           node.setNext(current)
           previous.setNext(node)

   def index(self, item):
       current = self.head
       found = False
       count = 0
       while current != None and not found:
           if current.getData() == item:
               found = True
           else:
               current = current.getNext()
               count += 1

       if found:
           return count
       else:
           return -1

   def pop(self, position=''):
       if position == '':
           found = False
           current = self.head
           previous = None
           while not found:
               if current.getNext() == None:
                   found = True
               else:
                   previous = current
                   current = current.getNext()

           if previous == None:
               self.head = current.getNext()
               return current.getData()
           else:
               previous.setNext(current.getNext())
               return current.getData()

       elif position == 0:
           current = self.head
           self.head = current.getNext()
           return current.getData()

       else:
           found = False
           current = self.head
           previous = None
           count = 0
           while not found:
               if count == position:
                   found = True
               elif current == None:
                   break
               else:
                   previous = current
                   current = current.getNext()
                   count += 1

           if previous == None:
               self.head = current.getNext()
               return previous.getData()
           elif current == None:
               return None
           else:
               previous.setNext(current.getNext())
               return current.getData()


#以列表的形式显示无序链表
   def showByList(self):
       current = self.head
       stop = False
       res = []
       while not stop:
           if current.getNext() == None:
               res.append(current.getData())
               stop = True
           else:
               res.append(current.getData())
               current = current.getNext()

       return res


           
上一篇:MissingMethodException: Default constructor not found


下一篇:【Bug】PicGo上传失败原因及解决-Branch master not found