ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python实现链表

2021-06-04 12:29:50  阅读:206  来源: 互联网

标签:current None item python self head 链表 实现 found


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


           

标签:current,None,item,python,self,head,链表,实现,found
来源: https://blog.csdn.net/qq_44974763/article/details/117556163

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有