QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 110|回复: 0

[Python] 有关单向链表的实现

[复制链接]

等级头衔

积分成就    金币 : 2804
   泡泡 : 1516
   精华 : 6
   在线时间 : 1243 小时
   最后登录 : 2024-5-2

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-7-28 10:15:27 | 显示全部楼层 |阅读模式
1 问题
' s+ n' G2 `) R. `" v链表在python中使用类(相当于C中的结构)实现链表,实现方法也同C语言一样,但是python中没有指针的概念,于是就采用嵌套的方式,将一个实例赋给指针域,效果就同指针一样。但是同C一样,这样的做法,需要实例化对象起指针的作用,这样会降低数据的存储密度。而有关单向链表的实现还存在些许疑点,本次周博客将针对于此问题展开讨论。
. `# ?# s. Q, ]; P$ h4 K2 方法
" `7 h5 }( H. M9 b/ c) D% c1 v" m
  • 定义一个创建节点的类;
  • 定义一个单向链表类;
  • 实现单向链表的展示功能.
    9 P7 v; v- m) F$ g/ ~2 R7 `: G  t
通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。
: ?, R0 r8 f! L  j" Z
  1. class SingleLinkList(object):
  2.    """单链表"""
  3.    def __init__(self):
  4.        self._head = None
  5.    def is_empty(self):
  6.        """判断链表是否为空"""
  7.        return self._head == None
  8.    def length(self):
  9.        """链表长度"""
  10.        # cur初始时指向头节点
  11.        cur = self._head
  12.        count = 0
  13.        # 尾节点指向None,当未到达尾部时
  14.        while cur != None:
  15.            count += 1
  16.            # 将cur后移一个节点
  17.            cur = cur.next
  18.        return count
  19.    def travel(self):
  20.        """遍历链表"""
  21.        cur = self._head
  22.        while cur != None:
  23.            print(cur.item)
  24.            cur = cur.next
  25.    def add(self, item):
  26.        """头部添加元素"""
  27.        # 先创建一个保存item值的节点
  28.        node = SingleNode(item)
  29.        # 将新节点的链接域next指向头节点,即_head指向的位置
  30.        node.next = self._head
  31.        # 将链表的头_head指向新节点
  32.        self._head = node
  33.    def append(self, item):
  34.        """尾部添加元素"""
  35.        node = SingleNode(item)
  36.        # 先判断链表是否为空,若是空链表,则将_head指向新节点
  37.        if self.is_empty():
  38.            self._head = node
  39.        # 若不为空,则找到尾部,将尾节点的next指向新节点
  40.        else:
  41.            cur = self._head
  42.            while cur.next != None:
  43.                cur = cur.next
  44.            cur.next = node
  45.    def insert(self, pos, item):
  46.        """指定位置添加元素"""
  47.        # 若指定位置pos为第一个元素之前,则执行头部插入
  48.        if pos <= 0:
  49.            self.add(item)
  50.        # 若指定位置超过链表尾部,则执行尾部插入
  51.        elif pos > (self.length() - 1):
  52.            self.append(item)
  53.        # 找到指定位置
  54.        else:
  55.            node = SingleNode(item)
  56.            count = 0
  57.            # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
  58.            pre = self._head
  59.            while count < (pos - 1):
  60.                count += 1
  61.                pre = pre.next
  62.            # 先将新节点node的next指向插入位置的节点
  63.            node.next = pre.next
  64.            # 将插入位置的前一个节点的next指向新节点
  65.            pre.next = node
  66.    def remove(self, item):
  67.        """删除节点"""
  68.        cur = self._head
  69.        pre = None
  70.        while cur != None:
  71.            # 找到了指定元素
  72.            if cur.item == item:
  73.                # 如果第一个就是删除的节点
  74.                if not pre:
  75.                    # 将头指针指向头节点的后一个节点
  76.                    self._head = cur.next
  77.                else:
  78.                    # 将删除位置前一个节点的next指向删除位置的后一个节点
  79.                    pre.next = cur.next
  80.                break
  81.            else:
  82.                # 继续按链表后移节点
  83.                pre = cur
  84.                cur = cur.next
  85.    def search(self, item):
  86.        """链表查找节点是否存在,并返回True或者False"""
  87.        cur = self._head
  88.        while cur != None:
  89.            if cur.item == item:
  90.                return True
  91.            cur = cur.next
  92.        return False
3 结语; v4 a& L. i, a4 ~8 v
针对有关单向链表的实现的问题,提出本次博客所涉及的方法,通过本次Python实验,证明该方法是有效的,本此的方法还存在许多不足或考虑不周的地方,希望可以在未来的学习过程中找到更有效的方法解决此类问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-4 04:04

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表