无序链表的实现

无序链表的实现

没有用容器存放输出,而是通过数据构成节点,节点之间存在一定关系,可以减少类似列表的数据类型存储方式所造成的内存资源的浪费。

基本方法

'''
construction
1、创建空链表
deconstruction
2、删除链表 clear()
parse operation
3、判断表是否为空 isEmpty()
4、判断表是否为满
加入元素
    5、表首段插入 add()
    6、一般的元素插入   insert()
    7、表尾加入 append()
删除元素
    7、删除表首元素 pop()
    8、一般情况的元素删除  remove()
扫描定位和遍历
    9、按下标定位  index()
    10、按元素定位  search()
11、求链表的长度  size()
'''

基本思路

构造一个节点的类,是关于当前节点和下一节点关系的一个类。
构造一个无序链表的类。
构造无序表我们需要一个表头,
所以创建一个空表我们只需要将表头设置为None即可。
同理,我们要清空链表,那么只需要将表头的数据改为None即可。
那么,判断链表为空也只需要看表头是否为None就好了。
链表的满只与题目的要求或实际内存有关系,所以在此不考虑。
无序表只有数据前后之间的关系,所以通过节点的类的方法,通过将下一节点和当前节点相联系,来添加元素。
删除则是将前一节点直接连接下一节点。
按元素定位,按下标定位和判断长度则需要挨个遍历整个链表才可以得到。

代码如下

#无序表抽象类型和Python实现
class Node:                     #定义节点
    def __init__(self,initdata):
        self.initdate = initdata      
        self.next = None        
    def getDate(self):          #得到当前节点
        return self.initdate        
    def getNext(self):          #得到下一节点
        return self.next
    def setDate(self,newdate):  #输入当前数据
        self.date = newdate
    def setNext(self,newnext):  #设置下一个节点
        self.next = newnext

class UnorderedList:
    def __init__(self):          #定义一个表头
        self.head = None
    def isEmpty(self):           #判断链表是否为空
        if self.head == None:
            return True
        else:
            return False
    def clear(self):             #清空链表里所有元素
        self.head = None
    def add(self,item):          #增加一个节点
        temp = Node(item)        #输入一个节点
        temp.setNext(self.head)  #将该节点的下一个next节点的地方改为head链头的数据,即指向表头表头向后移动
        self.head = temp         #将head的地方改为当前数据
    def size(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
        i = self.size()-1            #初始化
        while current != None and not found and i >0:    #当指针没有指到表尾的时候进行循环操作
            if current.getDate() == item:       #判断当前数据是否为想要查找的数据
                found = True                    #得到找到了
            else:                               #否则
                current = current.getNext()     #寻找下一个
        return found                            #返回最后的结果
    def index(self,item):        #查找一个元素的下标
        current = self.head
        i = 0
        while i<self.size() and current != item:
            i+=1
            current = current.getNext()
        return i
    def remove(self,item):                      #删除元素   方法为双指针
         current = self.head                    #当前指向表头
         previous = None                        #初始化
         found = False     
         i = self.size()-1                      #初始化
         while not found and i>0:                       #如果没有找到
             if current.getDate() == item:      #判断是否找到了这个数据
                 found = True                   #表示找到
             else:                              #如果没有找到
                 previous = current             #将previous辅助指针指向当前指针
                 current = current.getNext()   
                 i -=1                          #当前指针向后移动
         if previous == None:                   #如果第一个就找到了,即链表只有一个元素,且就是需要的元素
             self.head = current.getNext()      #
         else:
             previous.setNext(current.getNext())#将辅助指针跳过找到的那个数,该被找到的节点自动回收
    def pop(self):          #删除最后一个
        self.remove(self.size())
            
    def insert(self,pos,item):                    #一般情况下加入 用下标
        current = self.head
        previous = None
        i = pos
        if pos == 0:
            self.add(item)
        else:
            while i > 0 :
                i -= 1
                previous = current
                current = current.getNext()
            temp = Node(item)
            if previous == None:
                 temp.setNext(current)
            else:
                previous.setNext(temp)
                temp.setNext(current)
    def append(self,item):                        #尾端加入
        self.insert(self.size(),item)
    def show(self):
        current = self.head
        a = []
        i = self.size()
        if current != None:
            a.append(current.getDate())
        while i > 0:
            i -= 1
            current = current.getNext()
            if current != None:
                a.append(current.getDate())
        print(a)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值