美文网首页
用Python实现常见数据结构(1)——有序单向链表

用Python实现常见数据结构(1)——有序单向链表

作者: m2fox | 来源:发表于2018-05-15 08:02 被阅读0次

链表是一种常用的数据结构,而有序单向链表则是一种特殊的链表,可以在插入新的元素后仍保持元素有序,其思想类似于插入排序。下面用Python实现一个简单的有序单向列表数据结构:

# coding:utf-8
# python实现有序单向链表数据结构,以及基本操作
class Node(object):
    '''
    链表节点数据结构
    '''
    def __init__(self,data):
        '''
        初始化节点
        
        :type data: 数据,整型(可以按照实际需求定义为其他类型)
        '''
        self.data = data
        self.next = None
        
class OrderedLinkedList(object):
    '''
    有序单向链表数据结构
    '''
    def __init__(self,datas = []):
        '''
        初始化链表
        :type datas: 整数列表,默认为空
        '''
        # 链表头节点,初始化为None
        self.head = None
        for data in datas:
            self.insert(data)
        
    def insert(self,data):
        '''
        向链表插入数据,插入数据之后,链表依然保持有序
        
        :type data: 要插入的数据,整型
        '''
        new_node = Node(data)
        
        # 如果head节点为空,则直接把head节点指向新节点
        if not self.head:
            self.head = new_node
            return
        
        # 如果data小于head节点的值,则将新节点插入到head节点之前
        if data < self.head.data:
            new_node.next = self.head
            self.head = new_node
            return
            
        # 前后节点
        pre = self.head
        cur = self.head.next
        while cur:
            # 如果data大于等于cur.data,则继续下一次循环
            if data >= cur.data:
                pre = cur
                cur = cur.next
            # 否则退出循环
            else:
                break
        # 把新节点插入到pre和cur之间
        new_node.next = cur
        pre.next = new_node
        
    def delete(self,data):
        '''
        删除链表中指定数值的节点,如果不存在,抛出异常;如果有多个值相同的节点,则删除第一个查找到的节点
        
        :type data: 要删除的节点的数值,整型
        '''
        if not self.head:
            raise ValueError('element NOT exist!')
            
        # 如果head的值等于data,则删除head节点
        if data == self.head.data:
            self.head = self.head.next
            return
        
        pre = self.head
        cur = self.head.next
        while cur:
            if data == cur.data:
                pre.next = cur.next
                return
            pre = cur
            cur = cur.next
        raise ValueError('element NOT exist!')
        
    def search(self,data):
        '''
        查找某个数值的节点在链表中的下标位置(从0开始)
        如果有多个值相同的节点,则返回第一个查找到的节点的下标位置;如果没有找到,抛出异常
        
        :type data: 要查找的节点的数值,整型
        '''
        cur = self.head
        if not cur:
            raise ValueError('element NOT exist!')
            
        idx = 0
        while cur:
            if data == cur.data:
                return idx
                break
            idx += 1
            cur = cur.next
        raise ValueError('element NOT exist!')
        
    def output(self):
        '''
        输出链表的每个节点的数值,格式:'1->3->4->5'
        '''
        cur = self.head
        datas = []
        while cur:
            datas.append(str(cur.data))
            cur = cur.next
        print '->'.join(datas)
        
if __name__ == '__main__':
    # 测试初始化
    chain = OrderedLinkedList(range(5)[::-1])
    chain.output()
    
    # 测试插入数据
    chain.insert(2)
    chain.output()
    chain.insert(-1)
    chain.output()
    chain.insert(99)
    chain.output()
    
    # 测试查找数据
    print chain.search(99)
    print chain.search(2)
    # print chain.search(100)
    
    # 测试删除数据
    chain.delete(-1)
    chain.output()
    chain.delete(3)
    chain.output()
    chain.delete(99)
    chain.output()
    chain.delete(100)
    chain.output()
    
    # 输出:
    '''
    0->1->2->3->4
    0->1->2->2->3->4
    -1->0->1->2->2->3->4
    -1->0->1->2->2->3->4->99
    7
    3
    0->1->2->2->3->4->99
    0->1->2->2->4->99
    0->1->2->2->4
    Traceback (most recent call last):
      File "E:\code\algorithm\data-structure\linkedlist.py", line 145, in <module>
        chain.delete(100)
      File "E:\code\algorithm\data-structure\linkedlist.py", line 87, in delete
        raise ValueError('element NOT exist!')
    ValueError: element NOT exist!
    '''

代码已经更新至:我的GitHub

相关文章

  • 用Python实现常见数据结构(1)——有序单向链表

    链表是一种常用的数据结构,而有序单向链表则是一种特殊的链表,可以在插入新的元素后仍保持元素有序,其思想类似于插入排...

  • python中的树数据结构

    线性数据中的典型顺序表和链表已经讲完: 《顺序表数据结构在python中的应用》 《python实现单向链表数据结...

  • python3实现单向链表

    python3实现单向链表 最近重学数据结构,无奈c语言已经忘得一干二净,所以干脆用python来写。 一、代码结...

  • python数据结构教程 Day5

    python数据结构教程 Day5 本节重点: 有序表 链表实现list的算法分析 线性结构小结 一、有序表 1、...

  • 2017.5.25

    lua学习总结:数据结构: 使用Lua实现链表(单向链表和双向链表),队列 使用Lua保存图,用table保存,每...

  • python实现循环单链表

    参考: 用Python实现的数据结构与算法:链表

  • 数据结构 | 其二 链表

    冰河winner - 数据结构之链表 2.1 单向链表 数据结构(一) 单链表的实现-JAVA 2.2 双端链表 ...

  • 链表反转

    概述 链表反转是非常经典的面试题,要实现此功能,需先实现链表的数据结构。 链表类 获得单向链表方法 输出单向链表方...

  • 数据结构和算法(6)队列的操作和实现

    数据结构和算法(1)线性表实现 数据结构和算法(2)单向循环链表的创建插入删除实现 数据结构和算法(3)双向链表与...

  • 算法与数据结构知识汇总(二、链表)

    1、概念 2、链表的数据结构 单向链表的数据结构如下图: 上图数据结构为单向链表,简称单链表,该数据结构由若干个节...

网友评论

      本文标题:用Python实现常见数据结构(1)——有序单向链表

      本文链接:https://www.haomeiwen.com/subject/tcmrdftx.html