# 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实现单向链表详解】 链表是一种重要的数据结构,它不同于数组,不需预先定义大小,可以动态地增删元素。链表中的每个元素称为“节点”,每个节点包含数据域(存储数据)和指针域(指向下一个节点)。在...
在“单向链表”这个压缩包中,我们可能找到一个实现了上述功能的源代码文件,比如包含`insertAtEnd`、`deleteNode`、`printList`和`sortList`等函数的实现。通过阅读和分析这些代码,学生可以深入理解链表的内部工作...
在Python中,我们可以自定义链表结构来实现单向链表和双向链表。 单向链表(Single Linked List)的特点是每个节点只包含一个指向下一个节点的引用。在单向链表中,遍历只能从头节点开始,按顺序访问每个节点,无法...
在"第一、二章"的压缩文件中,很可能包含了实现单向链表和双向链表操作的C、C++、Java或Python等语言的源代码示例。这些示例程序可能涉及了初始化链表、插入新节点、删除指定节点、查找特定元素、打印链表内容等功能...
本篇将详细讲解如何使用Python实现获取单向链表倒数第k个结点的值,并通过实例分析相关操作技巧。 首先,我们需要定义链表的节点类`Node`,它包含一个数据项`item`和一个指向下一个节点的引用`next`。节点的初始化...
单向链表只能向前移动,而双向链表允许向前和向后移动。循环链表的最后一个节点指回列表的开头,形成一个环。 Python的内置数据结构如列表(list)已经实现了高效的随机访问,但在插入和删除操作上,特别是对于...
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。 表元素域elem...
单向链表是最简单的链表类型,其特点是每个节点只能向前遍历,不能向后。在某些情况下,我们需要对链表进行倒序操作,即将链表的顺序反转,例如将A->B->C转换为C->B->A。这个过程是Intel面试中常见的一个问题,旨在...
本文实例讲述了Python实现的数据结构与算法之链表。分享给大家供大家参考。具体分析如下: 一、概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的...
【Python 单向链表的基本操作细节】 链表是一种数据结构,它不同于数组,它将数据元素分散在内存的不同位置,而不是连续存储。单向链表是链表的一种形式,其中每个节点包含一个数据元素和一个指向下一个节点的引用...
以上就是Python单向循环链表的基本原理和实现方法。这种数据结构在处理循环任务、构建循环数据流等问题时非常有用,例如在图形渲染、音乐播放列表等场景中。通过理解和掌握这一数据结构,我们可以更有效地设计和实现...
本文实例讲述了python单向链表的基本实现与使用方法。分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 class Node(): def __init__(self,item): #初始化这个节点,值和下一个指向 self....
在Python编程中,单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的引用。链表中的环结构是指链表的末尾节点或中间某个节点指向了链表中的其他节点,形成了一个闭合的...
### Python单向链表的实现 #### 链表基础知识 链表是一种常见的线性数据结构,它由一系列节点组成,这些节点不一定要在内存中连续存放。每个节点包含两个部分:存储的数据(通常称为数据域)以及指向链表中下一个...
单向循环链表是一种特殊的数据结构,它结合了单向链表的特点和循环链表的功能。与普通的单向链表不同,单向循环链表中的最后一个节点不是指向`None`,而是指向链表的第一个节点(即头节点),形成一个闭环。 ### ...
本篇文章将详细讲解如何在Python中实现针对给定单链表删除指定节点的方法,以及相关的单链表操作技巧。 首先,我们需要定义一个`Node`类来表示链表中的节点。这个类包含两个属性:`num`用于存储数据,`next`则指向...
4-12 单向循环链表删除元素复习及链表扩展 4-13 双向链表及添加元素 4-14 双向链表删除元素 五、排序与搜索 5-01 排序算法的稳定性 5-02 冒泡排序及实现 5-03 选择排序算法及实现 5-04 插入算法 5-05 插入...