无序表的python实现

最近在MOOC上自学北京大学 《数据结构与算法Python版》陈斌 等

在课程313与314的无序表的链表实现,老师的代码并不十分详细,故在课下自我尝试实现了一下无序表的几个基本功能,在此分享

代码如下:

class MyNode:
     #初始化节点
    def __init__(self,data):
        self.data = data
        self.next = None

     #返回节点数据
    def getData(self):
        return self.data

     #返回节点的下一个节点(仍为MyNode类)
    def getNext(self):
        return self.next

     #修改节点的数据
    def setData(self,data):
        self.data = data

     #修改节点的下一个节点(在做列表的remove方法时,关键就是设置下一个节点)
    def setNext(self,next):
        self.next = next

class UnorderedList:
     #初始化列表头
    def __init__(self):
        self.head = None

     #添加元素(任意类型)(add(第一个参数为添加元素,默认为None, 第二个元素为插入位置,默认为‘last’,即表尾))
    def add(self, item=None, place='last'):
        if ((self.size() == 0) and (place == 'last')) or place == 0:   #在[0]处添加
            temp = MyNode(item)
            temp.setNext(self.head)
            self.head = temp

        elif (place == self.size()) or (place == 'last'):              #在末尾添加
            current = self.head
            while (current.getNext() != None) :
                current = current.getNext()
            temp = MyNode(item)
            current.setNext(temp)

        elif place > self.size():                                      #越界报错
            print('Sorry lenth of list just {0},\
            place is {1}!!! cannot above it'.format(self.size(),place))

        elif (place > 0) and (type(place) == int):                     #中间插入
            temp = MyNode(item)
            current = self.head
            count = 1
            while count < place:
                count = count + 1
                current = current.getNext()
            temp.setNext(current.getNext())
            current.setNext(temp)

        else:                                                          #不规范输入报错
            print('Error argument place!!!')

     #返回列表大小(size)
    def size(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current  = current.getNext()
        return count

     #删除指定元素(remove)(有多个重复对象,则删除第一个)
    def remove(self,item):
        current = self.head
        if current.getData() == item:                                   #开头删除
            self.head = current.getNext()
            current = None
            return item

        else:                                                           #非开头删除
            while (current.getNext()).getData() != item:
                current = current.getNext()
                if current.getNext() == None:
                    print("Sorry havn't found {0}!".format(item))       #未发现待删除对象
                    return None

            if (current.getNext()).getNext() == None:                   #结尾删除
                current.next = None
                return item

            else:                                                       #中间删除
                current.next = (current.getNext()).getNext()
                return item

     #展示列表内容(showData)
    def showData(self):
        current = self.head
        while current != None:
            print('{0}'.format(current.getData()), end=' ')
            current = current.getNext()


#代码测试
alist = UnorderedList()
alist.add(0)
print(alist.size())
alist.add(3, 0)
alist.add(4, 0)
alist.add(5)
alist.add([1, 2, 3], 2)
alist.add(None)
print('size is {0}'.format(alist.size()))

print('data is')
alist.showData()
print('\n')

alist.remove(6)
print('data is')
alist.showData()
print('\n')

alist.remove(5)
print('after remove 5 data is')
alist.showData()

运行结果:

"D:\mixture\python creat\数据结构\venv\Scripts\python.exe" "D:/mixture/python creat/数据结构/venv/MyNode.py"
1
size is 6
data is
4 3 [1, 2, 3] 0 5 None 

Sorry havn't found 6!
data is
4 3 [1, 2, 3] 0 5 None 

after remove 5 data is
4 3 [1, 2, 3] 0 None 
进程已结束,退出代码 0

这个无序表的实现过程中需要注意的是:

1.节点的next属性是下一个节点对象(除了最后一个节点)

2.列表中节点的属性data可以是None,而列表的最后一个节点的特征它的next属性是None

比较有意思的地方是:

本程序的remove方法中,非开头非结尾的删除并没有采用陈斌老师课件中的双指针来实现

而是用了节点的双重getNext来实现,这样current就是待删除的节点的前一个节点,要删除节点,直接将current的next属性设置为(current.getNext()).getNext()  (待删除节点的下一个节点)即可

 

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值