数据结构14:无序表抽象数据类型(链表)(二)

57 篇文章 12 订阅
47 篇文章 12 订阅

目录

 

一、无序表unorderlist的链表实现

1、无序表的add方法

2、链表实现:size方法

3、链表实现:search方法

4、链表实现:remove(item)方法


一、无序表unorderlist的链表实现

1、无序表的add方法

接下来考虑如何向无序表中添加数据项,实现add方法。由于无序表并没有限定数据项之间的顺序,因此新的数据项可以添加到原表的任何位置

按照实现的性能考虑,我们首先想到的肯定是最容易加入的位置。那么,哪里是最容易加入的位置呢?

由链表的结构我们知道,要访问到整条链上的所有数据项,都必须从表头的head开始,沿着next链接逐个向后查找,所以添加数据项最快捷的位置是表头,也就是整个链的首位置。

代码实现:

    def add(self, item):
        tmp = Node(item)
        tmp.setNext(self.head)    # 和下一行的顺序不能反了
        self.head = tmp

2、链表实现:size方法

size:从链条头head开始遍历到表尾同时用变量累加经过的节点的个数。

    def size(self):
        current = self.head
        count = 0

        while current != None:
            count += 1
            current = current.getNext()
        return count

3、链表实现:search方法

从链表头head开始遍历到表尾,同时判断当前节点的数据项是否为目标。

    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

4、链表实现:remove(item)方法

首先找到item,这个过程跟search方法一样,但是在删除节点时,需要特别的技巧:

  • current指向的是当前匹配数据项的节点,而删除需要把前一个节点的next指向current的下一个节点
  • 所以在用sear current的同时,需要维护前一节点的引用。

找到item之后,current指向item节点,previous指向前一个节点,开始执行删除。

    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:       # current是首个节点的情况
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

所有代码:

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

    def getData(self):
        return self.data  # 返回的数据项

    def getNext(self):
        return self.next  # 返回next

    def setData(self, newdata):
        self.data = newdata  # 设置新的数据项

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


class Unorderedlist:
    def __init__(self):
        self.head = None

    def add(self, item):
        tmp = Node(item)
        tmp.setNext(self.head)    # 和下一行的顺序不能反了
        self.head = tmp

    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
        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:       # current是首个节点的情况
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值