美文网首页
线性表(python实现line list)

线性表(python实现line list)

作者: sixiyizai | 来源:发表于2019-01-29 01:25 被阅读0次

实现 list 对象的 list.append, list.insert, list.pop 方法

# coding:utf-8
from typing import Iterable


class ListNode(object):
    def __init__(self, data=None, pre=None, post=None, index=None):
        """
        线性表节点
        :param data:
        :param pre:
        :param post:
        """
        self.data = data  # 存储的数据
        self.pre = pre  # 前一个节点
        self.post = post  # 下一个节点
        self.index = index  # 数据索引


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

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

    def append(self, value):
        """
        list.append(value)
        """
        cur_node = ListNode(data=value, index=self._len)
        if self.node is None:
            self.node = cur_node
        else:
            cur_node.pre = self._pre_node
            self._pre_node.post = cur_node
        self._pre_node = cur_node
        self._len += 1

    def insert(self, index, value):
        """
        list.insert(index, value)
        """
        if index > (self._len + 1):
            raise IndexError("index:{i} max then length:{l}".format(i=index, l=self._len))
        pre_nd = self.node
        while 1:
            cur_node = ListNode(data=value, index=index)
            if pre_nd.index == index:
                cur_node.post = pre_nd
                pre_nd.pre.post = cur_node
                self._add_index(cur_node.post)
                break
            pre_nd = pre_nd.post
        self._len += 1

    def pop(self):
        if self._len == 0:
            raise IndexError("pop empty object")
        cur_nd = self.node
        while 1:
            if cur_nd.index == (self._len - 1):
                del cur_nd.pre.post
                cur_nd.pre.post = None
                break
            cur_nd = cur_nd.post
        self._len -= 1

    @staticmethod
    def _sub_index(root: ListNode):
        while 1:
            root.index -= 1
            root = getattr(root, "post", None)
            if root is None:
                break

    @staticmethod
    def _add_index(root: ListNode):
        while 1:
            root.index += 1
            root = getattr(root, "post", None)
            if root is None:
                break

    def __len__(self):
        return self._len

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

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

    def _get_values(self, show_index=False):
        res, nd = [], self.node
        while 1:
            v = getattr(nd, 'data', None)
            if v is not None:
                res.append((nd.index, v) if show_index else v)
            else:
                break
            nd = nd.post
        return res


if __name__ == '__main__':
    ll = LineList(['a', 'b', 'c'])
    ll.append(1)
    ll.insert(1, 10)
    print(ll.values)
    print(len(ll))
    print()

    ll.pop()
    print(ll.values)
    print(len(ll))

相关文章

  • 线性表(python实现line list)

    实现 list 对象的 list.append, list.insert, list.pop 方法

  • Python 二分查找与 bisect 模块

    Python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.inde...

  • 2016-12-31-定义线性表的接口

    自己实现一个List类,深刻理解List类内部是怎么运作的。 实现一个线性表,需要实现什么方法?首先看下线性表的接...

  • 线性表-线性结构

    用C++实现线性表线性结构 List.h List.cpp 测试程序main.cpp

  • Java集合----List

    1.List简介 List接口是Java对线性表(逻辑上的)的特征的抽象。 2.List接口的实现 2.1Arra...

  • josephus问题

    线性表是数据结构的中很常见的结构,其中一种就是顺序表,python已经内置了顺序表。list就是循序表的的实现。下...

  • Python list 实现原理

    Python list 实现原理 我们通过本文描述CPython实现 list 列表对象,Cpython是pyt...

  • Python实现栈和队列以及使用list模拟栈和队列

    Python实现栈和队列 Python使用list模拟栈和队列

  • 线性表

    学习内容来自数据结构详解——线性表(C++实现) 线性表(List):零个或多个数据元素的有限序列。顺序表(数组)...

  • Java容器类快速入门

    List元素有放入顺序,元素可重复,主要实现包括ArrayList(基于数组的线性表)、LinkedList(双向...

网友评论

      本文标题:线性表(python实现line list)

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