`

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实现单向链表详解,分享了相关代码示例,每一步操作前都有简单分析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

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

    主要介绍了python实现获取单向链表倒数第k个结点的值,结合实例形式分析了Python针对单向链表的定义、遍历、传值、判断等相关操作技巧,需要的朋友可以参考下

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

    主要介绍了Python单向链表和双向链表原理与用法,结合实例形式详细分析了单向链表与双向链表的概念、原理以及创建、添加、删除等相关操作技巧,需要的朋友可以参考下

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

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

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

    主要介绍了python判断单向链表是否包括环,若包含则计算环入口的节点,结合实例形式分析了Python针对单向链表的遍历、判断相关算法原理与使用技巧,需要的朋友可以参考下

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

    主要介绍了python单向循环链表原理与实现方法,结合实例形式详细分析了Python单向循环链表概念、原理、定义及使用方法,需要的朋友可以参考下

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

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

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

    主要介绍了Python实现的单向循环链表功能,简单描述了单向循环链表的概念、原理并结合实例形式分析了Python定义与使用单向循环链表的相关操作技巧,需要的朋友可以参考下

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

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

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

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

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

    主要介绍了Python实现针对给定单链表删除指定节点的方法,结合实例形式分析了Python单链表的定义、节点添加、删除、打印等相关操作技巧,需要的朋友可以参考下

    python实现反转部分单向链表

    主要为大家详细介绍了python实现反转部分单向链表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    单向循环链表python

    单向循环链表(Singly Circular Linked List)是一种特殊的链表,它与普通的单向链表非常相似,唯一的区别在于尾节点的next指针指向头节点而不是空。这样就形成了一个循环,使得链表中的节点可以通过循环遍历而不会...

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

    今天是人生第一次写博客,记录自己学习的每一步,有些写...且链表的长度不是固定的,链表数据的这一特点使其可以非常的方便地实现节点的插入和删除操作 什么意思呢,我们在使用python列表的时候,如果我们需要删除列表

    python算法题 链表反转详解

    链表的反转是一个很常见、很基础的数据结构题,输入一个单向链表,输出逆序反转后的链表,如图:上面的链表转换成下面的链表。实现链表反转有两种方式,一种是循环迭代,另外一种方式是递归。 第一种方式:循坏...

Global site tag (gtag.js) - Google Analytics