美文网首页
单向链表 用Python 进行描述

单向链表 用Python 进行描述

作者: 机智的柠檬 | 来源:发表于2019-07-23 22:02 被阅读0次

    单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域,用来存储数据,一个是链接域,这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。


    image.png
    • 表元素elem 用来存放数据
    • 链接域next用来存放下一个节点的位置(python 中的标识)
    • 变量p指向链表的头节点的位置,从p出发能到链表的任意节点。
    节点实现:
    class Node(object):
        def __init__(self,elem):
            self.elem = elem
            self.next = None
    
    单链表的操作:
    • is_empty()链表是否为空
    • length() 链表长度
    • trave() 遍历整个链表
    • add(item) 在链表头部添加元素
    • append(item) 在链表尾部添加元素
    • insert(pos, item) 在链表pos位置添加元素
    • remove(item) 删除元素
    • search(item) 查找元素
    单链表的实现
    class SingleLinkList(object):
        def __init__():
            self.__head = None
        def is_empty(self):
            return self.__head == None
        def length(self):
            cur = self.__head
            count = 0
            while cur != None:
                count += 1
                cur = cur.next
            return count
        def travel():
            cur = self.__head
            while cur != None:
                print(cur.elem,end = " ")
                cur = cur.next
    
    头部添加元素
    image.png
    def add(item):
        node = Node(item):
        node.next = self.__head
        self.__head = node 
    

    尾部添加元素

    def append(item)
        node = Node(item)
        cur = self.__head
        if self.is__empty():
            self.__head = node
        else:
            while cur != None:
                cur = cur.next
            cur.next = node
    
    指定位置添加元素
    image.png
    def insert(self, pos, item):
        if pos <= 0:
            self.add(item)
        elif pos >= self.length():
            self.append(item)
        else:
            node = Node(item)
            pre = self.__head
            count = 0 
            while count < (pos-1):
                count += 1
                pre = pre.next
            node.next = pre.next
            pre.next = node 
    
    删除节点
    image.png
    def remove(item):
        cur = self.__head
        pre = None
        while cur != None:
            if cur.elem == item:
                if cur == self.__head:       
                    self.__head = cur.next
                else:
                    pre.next = cur.next
                #当删除之后要结束当前循环
                break
            else:
                pre = cur 
                cur = cur.next
       
    def search(item):
        cur = self.__head
        while cur != None:    
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return False 
    
    链表与顺序表的对比
    • 链表失去了顺序表随机读取的优点
    • 链表增加了节点的指针域,空间开销比较大
    • 链表对存储空间的使用要相对灵活
    • 链表的主要耗时工作是遍历,删除和插入操作本身的复杂度是O(1)
    • 顺序表查找很快,主要耗时操作是拷贝覆盖,除了目标元素在尾部的特殊情况,顺序表在进行插入和删除时需要对操作点之后的所有元素进行前后以为操作。

    链表与顺序表的各种操作复杂度对比:


    image.png

    相关文章

      网友评论

          本文标题:单向链表 用Python 进行描述

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