python 数据结构之单链表

今天是看书看的浑身难受的小黄鸭!!!!!!

链表

链表为什么会存在?

      顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充存储时有需要进行数据搬迁,所以使用起来不是很灵活。

       链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

链表的定义:

       链表(linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。

                                      

单向链表

       单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接则指向一个空值。

                          

表元素域elem用来存放具体的数据

节点域next用来存放下一节点的位置

变量p指向链表的头节点(省节点)的位置,从p出发能找到表中的任意节点

单链表节点定义

class SingleNode(object):
    def __init__(self,item):
        self.elem=item
        self.next=None

创建空链表

只需要把相应的表头变量设置为空链接,在python语言中将其设置为None。

删除链表

应丢弃这个链表里的所有节点,这个操作与具体的语言环境有关。在Python语言中,只需要简单地将表指针赋值为None,就抛弃了链表原有的所有节点。Python解释器的存储管理系统会自动回收不用的存储。

判断链表是否为空

将表头变量的值与空链接比较。在python语言中,就是检查相应变量的值是否为None。

相关代码

class Node(object):
    '''节点'''
    def __init__(self,elem):
        self.elem=elem
        self.next=None
          
class SingleLinkList(object):
    """单链表"""
    def __init__(self, node=None):
        self.__head = node

    def is_empty(self):
        """链表是否为空"""
        return self.__head == None

    def length(self):
        """链表长度"""
        # cur游标,用来移动遍历节点
        cur = self.__head
        # count记录数量
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur != None:
            print(cur.elem,end=' ')
            cur = cur.next
        print()


    def add(self, item):
        """链表头部添加元素"""
        node=Node(item)
        node.next=self.__head
        self.__head=node

    def append(self, item):
        """链表尾部添加元素"""
        node = Node(item)
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            cur.next = node

    def insert(self, pos, item):
        """指定位置添加元素"""
        if pos<=0:
            self.add(item)
        elif pos>=self.length()-1:
            self.append(item)
        else:
            court=0
            cur=self.__head
            while court<(pos-1):
                cur=cur.next
                court+=1
            node=Node(item)
            node.next=cur.next
            cur.next=node
        
    def remove(self, 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(self, item):
        """查找节点是否存在"""
        cur=self.__head
        while cur!=None:
            if cur.elem==item:
                return True
            else:
                cur=cur.next
        return False

if __name__ == "__main__":
    ll = SingleLinkList()
    print(ll.is_empty())

链表操作的时间复杂度

创建空表:O(1)

删除表:在python里是O(1)

判断空表:O(1)

加入元素:

  1. 在首段加入元素:O(1)
  2. 在尾端加入元素 :O(n)
  3. 定位加入元素 :O(n)

删除元素:

  1. 首端删除:O(1)
  2. 尾端删除:O(n)
  3. 定位删除:O(n)

求表的长度:O(n)

猜你喜欢

转载自blog.csdn.net/xiaolangmin/article/details/88535172