• Python数据结构应用3——链表


    linked list(链表) 建立

    Node

    链表的基本组成就是一个个Node,每个Node都需要包括两部分内容,一部分是自身的data,另一部分是下一个Node的reference。
    这里写图片描述

    class Node:
        def __init__(self, init_data):
            self.data = init_data
            self.next = None
        def get_data(self):
            return self.data  
        def get_next(self):
            return self.next
        def set_data(self, new_data):
            self.data = newdata
        def set_next(self, new_next):
            self.next = new_next  

    每一个链表都有一个Head和一个End结点,End结点的nextNone

    无序链表

    this list is unordered, the specific location of the new item with respect to the other items already in the list is not important. The new item can go anywhere.

    add操作

    python链表增加新结点的过程我觉得跟我用C语言写还是有差别的。
    这里写图片描述

    整个过程如图,增加的结点位于链表的头部,也就是说,向前增加新结点:

    1. 创建新结点
    2. 将新结点的next指向旧链表的head
    3. 将新链表的head设为新结点

    ‘遍历’操作(traverse)

    get_next()方法是该操作中主要用到的函数。

    size, search, remove 都是基于‘遍历’操作

    size操作

    1. 找到head
    2. 沿着head一个个摸下去,摸一个count+1

    search操作

    1. 找到head
    2. 沿着head一个个摸下去,摸到item返回True,摸不到继续往下摸

    remove操作

    想要remove掉一个node,必须找到此node的前后两个nodes,并把他们这两个nodes连接起来。

    1. 找到head
    2. 沿着head一个个摸下去,且实时记录前方的node,摸到对应的item后链接该node的前后两个nodes
    3. 如果remove的那个node正好是head,则直接把head权给予接下去的那个node
    class UnorderList:
        def __init__(self):
            self.head = None
        def is_empty(self):
            return self.head == None
        def add(self, item):
            temp = Node(item)  #创建新结点    
            temp.set_next(self.head)  #将新结点链接之前的list
            self.head = temp   #将新结点设为head
        def size(self):
            current = self.head
            count = 0
            while current != None:
                count += count
                current = current.get_next()
            return count
        def search(self, item):
            current = self.head
            found = False
            while current != None and not found:
                if current.get_data() == item:
                    found = True
                else:
                    current = current.get_next()
            return found
        def remove(self, item):
            current = self.head()
            previous = None
            found = False
            while not found:
                if current.get_data() == item:
                    found = True
                else:
                    previous = current
                    current = current.get_next()
            if previous == None:
                self.head = current.get_next()
            else:
                previous.set_next(current.get_next())

    如果你执行一个insert(0,item)操作在一个list上,时间复杂度为O(n)。 但是对于无序链表来说,执行一个相同的操作是需要O(1)的时间复杂度

    有序链表

    就是将无序链表中的每个node的data进行了变得有大小顺序了。Node的class没有变化。

    class orderList:
        def __init__(self): # 无变化
            self.head = None
        def is_empty(self): # 无变化
            return self.head == None
        def add(self, item):  # 变化最大的在这里
            current = self.head
            previous = None
            stop = False
            while current != None and not stop:
                if current.get_data() > item:
                    stop = True
                else:
                    previous = current
                    current = current.get_next()
            temp = Node(item)
            if previous == None:
                temp.set_next(self.head)
                self.head = temp
            else:
                temp.set_next(current)
                previous.set_next(temp)
        def size(self): # 无变化
            current = self.head
            count = 0
            while current != None:
                count += count
                current = current.get_next()
            return count
        def search(self, item): # 其实基本没变化,stop可有可无
            current = self.head
            found = False
            stop = False
            while current != None and not found and not stop:
                if current.get_data() == item:
                    found = True
                else:
                    if current.get_data() > item:
                        stop = True
                    else:
                        current = current.get_next()
            return found
        def remove(self, item): # 无变化
            current = self.head()
            previous = None
            found = False
            while not found:
                if current.get_data() == item:
                    found = True
                else:
                    previous = current
                    current = current.get_next()
            if previous == None:
                self.head = current.get_next()
            else:
                previous.set_next(current.get_next())
    转载请注明原文链接,对本文有任何建议和意见请在评论区讨论,谢谢!
  • 相关阅读:
    c# 启动线程的方式
    c# 打开文件夹获取所有文件
    windows server 2008 R2 SP1 安装SQL Server 2008 R2时提示 "此操作系统不支持此版本的 SQL Server 版本"
    mongodb 备份 指定用户名密码
    c# 线程启动的两种方式与传参
    vs 2015 密钥
    c# 时间格式yyyy-MM-ddTHH:mm:ss
    c# oledb sql 报错 标准表达式中数据类型不匹配
    CentOS下yum安装dnsmasq,并强制替换为最新版
    使用QUOTA(磁盘配额)来限制用户空间
  • 原文地址:https://www.cnblogs.com/bjwu/p/8970819.html
Copyright © 2020-2023  润新知