鱼C论坛

 找回密码
 立即注册
查看: 2365|回复: 0

[学习笔记] python 实现线性表(line list)

[复制链接]
发表于 2019-1-29 01:08:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 1968609663 于 2019-1-29 01:13 编辑

参照《数据结构与算法》第八集
代码写的比较粗糙,实现:list.insert, list.append, list.pop 三个方法,实现的比较复杂,且存在bug

  1. from typing import Iterable


  2. class ListNode(object):
  3.     def __init__(self, data=None, pre=None, post=None, index=None):
  4.         """
  5.         线性表节点
  6.         :param data:
  7.         :param pre:
  8.         :param post:
  9.         """
  10.         self.data = data  # 存储的数据
  11.         self.pre = pre  # 前一个节点
  12.         self.post = post  # 下一个节点
  13.         self.index = index  # 数据索引


  14. class LineList(object):
  15.     def __init__(self, arr: Iterable = None):
  16.         """python版本链式表"""
  17.         self.node = None
  18.         self._len = 0
  19.         self._pre_node = None
  20.         self._init(arr if arr is not None else [])

  21.     def _init(self, arr: Iterable):
  22.         for b in arr:
  23.             self.append(b)

  24.     def append(self, value):
  25.         """
  26.         list.append(value)
  27.         """
  28.         cur_node = ListNode(data=value, index=self._len)
  29.         if self.node is None:
  30.             self.node = cur_node
  31.         else:
  32.             cur_node.pre = self._pre_node
  33.             self._pre_node.post = cur_node
  34.         self._pre_node = cur_node
  35.         self._len += 1

  36.     def insert(self, index, value):
  37.         """
  38.         list.insert(index, value)
  39.         """
  40.         if index > (self._len + 1):
  41.             raise IndexError("index:{i} max then length:{l}".format(i=index, l=self._len))
  42.         pre_nd = self.node
  43.         while 1:
  44.             cur_node = ListNode(data=value, index=index)
  45.             if pre_nd.index == index:
  46.                 cur_node.post = pre_nd
  47.                 pre_nd.pre.post = cur_node
  48.                 self._add_index(cur_node.post)
  49.                 break
  50.             pre_nd = pre_nd.post
  51.         self._len += 1

  52.     def pop(self):
  53.         if self._len == 0:
  54.             raise IndexError("pop empty object")
  55.         cur_nd = self.node
  56.         while 1:
  57.             if cur_nd.index == (self._len - 1):
  58.                 cur_nd.pre.post = None
  59.                 break
  60.             cur_nd = cur_nd.post
  61.         self._len -= 1


  62.     @staticmethod
  63.     def _sub_index(root: ListNode):
  64.         while 1:
  65.             root.index -= 1
  66.             root = getattr(root, "post", None)
  67.             if root is None:
  68.                 break

  69.     @staticmethod
  70.     def _add_index(root: ListNode):
  71.         while 1:
  72.             root.index += 1
  73.             root = getattr(root, "post", None)
  74.             if root is None:
  75.                 break

  76.     def __len__(self):
  77.         return self._len

  78.     @property
  79.     def values(self):
  80.         return self._get_values(show_index=False)

  81.     @property
  82.     def index_values(self):
  83.         return self._get_values(show_index=True)

  84.     def _get_values(self, show_index=False):
  85.         res, nd = [], self.node
  86.         while 1:
  87.             v = getattr(nd, 'data', None)
  88.             if v is not None:
  89.                 res.append((nd.index, v) if show_index else v)
  90.             else:
  91.                 break
  92.             nd = nd.post
  93.         return res


  94. if __name__ == '__main__':
  95.     ll = LineList(['a', 'b', 'c'])
  96.     ll.append(1)
  97.     ll.insert(1, 10)
  98.     print(ll.values)
  99.     print(len(ll))
  100.     print()

  101.     ll.pop()
  102.     print(ll.values)
  103.     print(len(ll))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 20:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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