zoukankan      html  css  js  c++  java
  • python数据结构——单向链表

    链表 ( Linked List )

    • 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表.
    • 特点:各个数据在计算机中是随机存放且不连续.
    • 优点:数据的增删改查都很方便,当有新的数据加入的时候,只需要向系统申请一块新的内存即 可,当数据被删除的时候内存会被回收,整个过程不需要移动大量数据
    • 缺点:设计数据库的时候比较困难而且麻烦,查找数据的时候不能像静态数据库那样随机读取,必须按照顺序读取直到找到数据为止.

    单向链表 ( Single Linked List )

    • 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表,又称为结点列表,因为链表是由一个个结点组装起来的,其中每个结点都有指针成员变量指向列表中的下一个结点,链表头的第一个指针叫做链表头指针, 而最后一个数据的节点指向一个空值。

    在这里插入图片描述

    • 表元素域elem用来存放具体的数据。
    • 链接域next用来存放下一个节点的位置(python中的标识)
    • 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点
    • 只要链表头指针存在,就可以遍历整个链表,进行增删改查等操作,所以一般情况下尽量不要移动链表头指针的位置。

    节点的创建

    用类来实现动态分配产生链表节点的节点,然后在类中定义指针字段,用于指向下一个链表节点。

    class SingleNode(object):
        """单链表的结点"""
        def __init__(self,item):
            # _item存放数据元素
            self.item = item
            # _next是下一个节点的标识
            self.next = None
    

    单向链表的基本操作

    • is_empty() 链表是否为空
    • length() 链表长度
    • travel() 遍历整个链表
    • add(item) 链表头部添加元素
    • append(item) 链表尾部添加元素
    • insert(postion, item) 指定位置添加元素
    • remove(item) 删除节点
    • search(item) 查找节点是否存在

    单向链表的实现

    class SingleLinkList(object):
        """单向链表"""
        def __init__(self):
            self.head = None #
    
        def is_empty(self):
            """判断链表是否为空"""
            return self.head == None
    
        def length(self):
            """链表长度"""
            # cur初始时指向头节点
            cur = self.head
            count = 0
            # 尾节点指向None,当未到达尾部时
            while cur != None:
                count += 1
                # 将cur后移一个节点
                cur = cur.next
            return count
    
        def travel(self):
            """遍历链表"""
            cur = self.head
            while cur != None:
                print cur.item,
                cur = cur.next
            print('')
    

    头部添加元素

    在这里插入图片描述

      def add(self, item):
          """头部添加元素"""
          # 先创建一个保存item值的节点
          node = SingleNode(item)
          # 将新节点的链接域next指向头节点,即_head指向的位置
          node.next = self._head
          # 将链表的头_head指向新节点
          self._head = node
    

    尾部添加元素

        def append(self, item):
            """尾部添加元素"""
            node = SingleNode(item)
            # 先判断链表是否为空,若是空链表,则将_head指向新节点
            if self.is_empty():
                self._head = node
            # 若不为空,则找到尾部,将尾节点的next指向新节点
            else:
                cur = self._head
                while cur.next != None:
                    cur = cur.next
                cur.next = node
    

    指定位置添加元素

    在这里插入图片描述

     def insert(self, pos, item):
          """指定位置添加元素"""
          # 若指定位置pos为第一个元素之前,则执行头部插入
          if pos <= 0:
              self.add(item)
          # 若指定位置超过链表尾部,则执行尾部插入
          elif pos > (self.length()-1):
              self.append(item)
          # 找到指定位置
          else:
              node = SingleNode(item)
              count = 0
              # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
              pre = self._head
              while count < (pos-1):
                  count += 1
                  pre = pre.next
              # 先将新节点node的next指向插入位置的节点
              node.next = pre.next
              # 将插入位置的前一个节点的next指向新节点
              pre.next = node
    

    删除节点

    在这里插入图片描述

        def remove(self,item):
            """删除节点"""
            cur = self._head
            pre = None
            while cur != None:
                # 找到了指定元素
                if cur.item == item:
                    # 如果第一个就是删除的节点
                    if not pre:
                        # 将头指针指向头节点的后一个节点
                        self._head = cur.next
                    else:
                        # 将删除位置前一个节点的next指向删除位置的后一个节点
                        pre.next = cur.next
                    break
                else:
                    # 继续按链表后移节点
                    pre = cur
                    cur = cur.next
    

    查找节点是否存在

        def search(self,item):
            """链表查找节点是否存在,并返回True或者False"""
            cur = self._head
            while cur != None:
                if cur.item == item:
                    return True
                cur = cur.next
            return False
    

    测试

    if __name__ == "__main__":
        ll = SingleLinkList()
        ll.add(1)
        ll.add(2)
        ll.append(3)
        ll.insert(2, 4)
        print "length:",ll.length()
        ll.travel()
        print ll.search(3)
        print ll.search(5)
        ll.remove(1)
        print "length:",ll.length()
        ll.travel()
    
  • 相关阅读:
    小程序中自定义组件
    rem是如何实现自适应布局的?
    基于vue前端状态管理模式
    vue项目使用keep-alive的作用
    JS移动元素的方法
    es6 promise then对异常处理的方法
    async/await 中await接收的promise的问题
    angularjs ngRoute demo
    angularjs $watch demo
    Html5 Geolocation demo
  • 原文地址:https://www.cnblogs.com/coding-996/p/12000252.html
Copyright © 2011-2022 走看看