`

python实现单向链表(python27)

 
阅读更多

 

 

 

 

# encoding:utf-8


class NodeException(Exception): 
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)


class LinkedListError(Exception): 
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)


class Node(object):
    def __init__(self, data, next=None):
        self.data = data
        self.next = next
    def __repr__(self):
        return  str(self.data)


class LinkedList(object):
    def __init__(self):
        self.head = None
        self.__last_index = 0
        self.__cnt = 0

    def __len__(self):
        if self.head == None:
            rtn = 0
        else:
            rtn = self.__last_index + 1
        return rtn

    def __repr__(self):
        elements = []
        for n in range(len(self)):
            elements.append(str(self[n].data))
        return  '[' + ', '.join(elements) + ']'

    def __str__(self):
        return self.__repr__()

    def is_empty(self):
        return self.head == None

    def add(self, node):
        if not isinstance(node, Node):
            raise NodeException('must add a Node')
        if self.is_empty():
            self.head = node
        else:
            last_node = self[self.__last_index]
            last_node.next = node
            self.__last_index += 1

    def __getitem__(self, index):
        if index < 0 or index > len(self):
            raise LinkedListError('index out of range')
        if self.is_empty():
            print 'list is empty'
        elif index == 0:
            return self.head
        else:
            for n in range(1, index+1):
                if n == 1:
                    node = self.head.next
                else:
                    node = node.next
            return node

    def __iter__(self):
        return self

    def next(self):
        
        if self.__cnt >= len(self):
            raise StopIteration()
        rtn = self[self.__cnt]
        self.__cnt += 1
        return rtn


    def remove(self, index):
        if index < 0 or index > len(self):
            raise LinkedListError('index out of range')
        if index == 0:
            next = self.head.next
            self.head = next
        else:
            self[index-1].next = self[index+1] 

        self.__last_index -= 1

    def insert(self, node, index):
        if index == 0:
            node.next = self.head
            self.head = node
        elif index == self.__last_index + 1:
            self[self.__last_index].next = node
        else:
            node.next = self[index]
            self[index-1].next = node
            
        self.__last_index += 1


def __test():
    a = LinkedList()
    print 'length after init: {}'.format(len(a))
    n1 = Node(1)
    n2 = Node(2)
    n3 = Node(3)
    n4 = Node(4)
    a.add(n1)
    print 'length after add: {}'.format(len(a))
    a.add(n2)
    print 'length after add: {}'.format(len(a))
    a.add(n3)
    print a
    print 'length after add: {}'.format(len(a))
    a.remove(2)
    print 'length after remove: {}'.format(len(a))
    print a
    n4 = Node('insert0')
    a.insert(n4,0)
    n5 = Node('insert_to_end')
    a.insert(n5, len(a))
    print a, len(a)
    n6 = Node('insert_middle')
    a.insert(n6, 2)
    print a, len(a)
    n7 = Node('add again')
    a.add(n7)
    print a, len(a)
    
    for n in a:
        print 'test iterator ----- {}'.format(n)

if __name__ == '__main__':
    __test()

 

 

 

分享到:
评论

相关推荐

    python实现单向链表详解

    【Python实现单向链表详解】 链表是一种重要的数据结构,它不同于数组,不需预先定义大小,可以动态地增删元素。链表中的每个元素称为“节点”,每个节点包含数据域(存储数据)和指针域(指向下一个节点)。在...

    单向链表 代码架构

    在“单向链表”这个压缩包中,我们可能找到一个实现了上述功能的源代码文件,比如包含`insertAtEnd`、`deleteNode`、`printList`和`sortList`等函数的实现。通过阅读和分析这些代码,学生可以深入理解链表的内部工作...

    Python单向链表和双向链表原理与用法实例详解

    在Python中,我们可以自定义链表结构来实现单向链表和双向链表。 单向链表(Single Linked List)的特点是每个节点只包含一个指向下一个节点的引用。在单向链表中,遍历只能从头节点开始,按顺序访问每个节点,无法...

    数据结构 单向链表 双向链表 源程序

    在"第一、二章"的压缩文件中,很可能包含了实现单向链表和双向链表操作的C、C++、Java或Python等语言的源代码示例。这些示例程序可能涉及了初始化链表、插入新节点、删除指定节点、查找特定元素、打印链表内容等功能...

    python实现获取单向链表倒数第k个结点的值示例

    本篇将详细讲解如何使用Python实现获取单向链表倒数第k个结点的值,并通过实例分析相关操作技巧。 首先,我们需要定义链表的节点类`Node`,它包含一个数据项`item`和一个指向下一个节点的引用`next`。节点的初始化...

    链表-使用Python实现链表数据结构.zip

    单向链表只能向前移动,而双向链表允许向前和向后移动。循环链表的最后一个节点指回列表的开头,形成一个环。 Python的内置数据结构如列表(list)已经实现了高效的随机访问,但在插入和删除操作上,特别是对于...

    python数据结构链表之单向链表(实例讲解)

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

    链表倒序__实现单向链表倒序

    单向链表是最简单的链表类型,其特点是每个节点只能向前遍历,不能向后。在某些情况下,我们需要对链表进行倒序操作,即将链表的顺序反转,例如将A-&gt;B-&gt;C转换为C-&gt;B-&gt;A。这个过程是Intel面试中常见的一个问题,旨在...

    Python实现的数据结构与算法之链表详解

    本文实例讲述了Python实现的数据结构与算法之链表。分享给大家供大家参考。具体分析如下: 一、概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的...

    python单向链表的基本操作细节(小白入门)

    【Python 单向链表的基本操作细节】 链表是一种数据结构,它不同于数组,它将数据元素分散在内存的不同位置,而不是连续存储。单向链表是链表的一种形式,其中每个节点包含一个数据元素和一个指向下一个节点的引用...

    python单向循环链表原理与实现方法示例

    以上就是Python单向循环链表的基本原理和实现方法。这种数据结构在处理循环任务、构建循环数据流等问题时非常有用,例如在图形渲染、音乐播放列表等场景中。通过理解和掌握这一数据结构,我们可以更有效地设计和实现...

    python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】

    本文实例讲述了python单向链表的基本实现与使用方法。分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 class Node(): def __init__(self,item): #初始化这个节点,值和下一个指向 self....

    python判断单向链表是否包括环,若包含则计算环入口的节点实例分析

    在Python编程中,单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的引用。链表中的环结构是指链表的末尾节点或中间某个节点指向了链表中的其他节点,形成了一个闭合的...

    浅谈Python单向链表的实现

    ### Python单向链表的实现 #### 链表基础知识 链表是一种常见的线性数据结构,它由一系列节点组成,这些节点不一定要在内存中连续存放。每个节点包含两个部分:存储的数据(通常称为数据域)以及指向链表中下一个...

    Python实现的单向循环链表功能示例

    单向循环链表是一种特殊的数据结构,它结合了单向链表的特点和循环链表的功能。与普通的单向链表不同,单向循环链表中的最后一个节点不是指向`None`,而是指向链表的第一个节点(即头节点),形成一个闭环。 ### ...

    Python实现针对给定单链表删除指定节点的方法

    本篇文章将详细讲解如何在Python中实现针对给定单链表删除指定节点的方法,以及相关的单链表操作技巧。 首先,我们需要定义一个`Node`类来表示链表中的节点。这个类包含两个属性:`num`用于存储数据,`next`则指向...

    python数据结构与算法详解与源码

    4-12 单向循环链表删除元素复习及链表扩展 4-13 双向链表及添加元素 4-14 双向链表删除元素 五、排序与搜索 5-01 排序算法的稳定性 5-02 冒泡排序及实现 5-03 选择排序算法及实现 5-04 插入算法 5-05 插入...

Global site tag (gtag.js) - Google Analytics