单向链表的Python实现
2017-09-01 11:39
459 查看
链表简介
单向链表
具体实现
节点Node
单向链表SingleLinkedList
检测是否为空isEmpty
判断长度size
头部插入元素add
尾部插入元素append
根据索引值得到该节点的数据getVal
检索元素的索引值index
插入insert
删除remove
全部代码
参考资料
优点:可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理
缺点:失去了数组随机读取的优点,链表由于增加了结点的指针域,空间开销比较大。 —— 维基百科
链表中最简单的一种是单向链表,它包含两个域,一个信息域用来存储数据,一个指针域用来存储链接,该链接指向列表中的下一个节点,而最后一个节点则指向一个空值(NULL)。
单向链表
初始化链表
检测是否为空
判断长度
头部插入元素
尾部插入元素
根据索引值得到该节点的数据
检索元素的索引值
插入
在pre、lat两个节点之间插入一个节点cur,就相当于把左侧的节点pre的这阵指向要插入的节点cur,再把要插入的节点cur的指针指向右侧的节点lat
删除
删除某个节点cur,只要将前一个节点pre的指针指向cur的指针指向的节点就可以了
【Python数据结构——链表的实现】
由于本人水平有限,难免出现错漏之处,欢迎批评指正
单向链表
具体实现
节点Node
单向链表SingleLinkedList
检测是否为空isEmpty
判断长度size
头部插入元素add
尾部插入元素append
根据索引值得到该节点的数据getVal
检索元素的索引值index
插入insert
删除remove
全部代码
参考资料
链表简介
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。优点:可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理
缺点:失去了数组随机读取的优点,链表由于增加了结点的指针域,空间开销比较大。 —— 维基百科
单向链表
链表中最简单的一种是单向链表,它包含两个域,一个信息域用来存储数据,一个指针域用来存储链接,该链接指向列表中的下一个节点,而最后一个节点则指向一个空值(NULL)。
具体实现
节点(Node)
class Node(): # Node实例只接受val、next两个属性 __slots__=['_val', '_next'] def __init__(self, val): self._val = val # Node的指针部分默认指向None self._next = None # 得到节点的值 def getVal(self): return self._val def getNext(self): return self._next # 设置节点的值 def setVal(self, newVal): self._val = newVal def setNext(self,newNext): self._next = newNext
单向链表SingleLinkedList
初始化链表class SingleLinkedList(): def __init__(self): #初始化链表为空表 self._head = None def initList(self, data): self._head = Node(data[0]) currentNode = self._head for i in data[1:]: tmpNode = Node(i) currentNode.setNext(tmpNode) currentNode = currentNode.getNext()
检测是否为空isEmpty
def isEmpty(self): return self._head == None
判断长度size
def size(self): currentNode = self._head count = 0 while current! = None: countNode += 1 currentNode = currentNode.getNext() return count
头部插入元素add
def add(self,val): tmpNode = Node(val) tmpNode.setNext(self._head) self._head = tmpNode
尾部插入元素append
def append(self,val): tmpNode = Node(val) # 若为空,中间节点成为表头 if self.isEmpty(): self._head = tmpNode else: currentNode = self._head #遍历链表 while currentNode.getNext() != None: currentNode = currentNode.getNext() # 将中间节点添加到结尾 current.setNext(tmpNode)
根据索引值得到该节点的数据getVal
def getVal(self,pos): if self.isEmpty(): raise ValueError('LikedList is empty') elif pos <= 0 or pos > self.size(): raise ValueError('Index Exceeds The Size of LInkedList') else: currentNode = self._head for i in range(pos-1): currentNode = currentNode.getNext() return currentNode.getVal()
检索元素的索引值index
def index(self,val): currentNode = self._head count = 0 foundStatus = None while currentNode != None and not foundStatus: count += 1 if currentNode.getVal() == val: foundStatus = True else: currentNode = currentNode.getNext() if foundStatus: return count else: raise ValueError('%s is not in LinkedList'%val)
插入insert
在pre、lat两个节点之间插入一个节点cur,就相当于把左侧的节点pre的这阵指向要插入的节点cur,再把要插入的节点cur的指针指向右侧的节点lat
def insert(self, pos, val): if pos<=1: self.add(val) elif pos>self.size(): self.append(val) else: tmpNode = Node(val) count = 1 preNode = None currentNode = self._head while count<pos: count += 1 preNode = currentNode currentNode = currentNode.getNext() preNode.setNext(tmpNode) tmpNode.setNext(currentNode)
删除remove
删除某个节点cur,只要将前一个节点pre的指针指向cur的指针指向的节点就可以了
def remove(self,val): # 当前节点 currentNode = self._head # 前一个节点 preNode = None while currentNode != None: if currentNode.getVal() == val: # 判断是不是表头 if not preNode: self._head = currentNode.getNext() else: preNode.setNext(currentNode.getNext()) break else: preNode = currentNode currentNode = currentNode.getNext()
全部代码
class Node(): # Node实例只接受val、next两个属性 __slots__=['_val', '_next'] def __init__(self, val): self._val = val # Node的指针部分默认指向None self._next = None # 得到节点的值 def getVal(self): return self._val def getNext(self): return self._next # 设置节点的值 def setVal(self, newVal): self._val = newVal def setNext(self,newNext): self._next = newNext
class SingleLinkedList():
def __init__(self):
#初始化链表为空表
self._head= None
self._size = 0
def initList(self, data):
self._head = Node(data[0])
currentNode = self._head
for i in data[1:]:
tmpNode = Node(i)
currentNode.setNext(tmpNode)
currentNode = currentNode.getNext()
def size(self):
currentNode = self._head
count = 0
while currentNode != None:
count += 1
currentNode = currentNode.getNext()
return count
def isEmpty(self):
return self._head == None
def add(self,val):
tmpNode = Node(val)
tmpNode.setNext(self._head)
self._head = tmpNode
def append(self,val):
tmpNode = Node(val)
# 若为空,中间节点成为表头
if self.isEmpty():
self._head = tmpNode
else:
currentNode = self._head
#遍历链表
while currentNode.getNext() != None:
currentNode = currentNode.getNext()
# 将中间节点添加到结尾
current.setNext(tmpNode)
def getVal(self,pos):
if self.isEmpty():
raise ValueError('LikedList is empty')
elif pos <= 0 or pos > self.size():
raise ValueError('Index Exceeds The Size of LInkedList')
else:
currentNode = self._head
for i in range(pos-1):
currentNode = currentNode.getNext()
return currentNode.getVal()
def index(self,val):
currentNode = self._head
count = 0
foundStatus = None
while currentNode != None and not foundStatus:
count += 1
if currentNode.getVal() == val:
foundStatus = True
else:
currentNode = currentNode.getNext()
if foundStatus:
return count
else:
raise ValueError('%s is not in LinkedList'%val)
def remove(self,val):
# 当前节点
currentNode = self._head
# 前一个节点
preNode = None
while currentNode != None:
if currentNode.getVal() == val:
# 判断是不是表头
if not preNode:
self._head = currentNode.getNext()
else:
preNode.setNext(currentNode.getNext())
break
else:
preNode = currentNode
currentNode = currentNode.getNext()
def insert(self, pos, val):
if pos<=1:
self.add(val)
elif pos>self.size():
self.append(val)
else:
tmpNode = Node(val)
count = 1
preNode = None
currentNode = self._head
while count<pos:
count += 1
preNode = currentNode
currentNode = currentNode.getNext()
preNode.setNext(tmpNode)
tmpNode.setNext(currentNode)
参考资料
【数据结构之链表与数组(二) -单向链表上的简单操作问题】【Python数据结构——链表的实现】
由于本人水平有限,难免出现错漏之处,欢迎批评指正
相关文章推荐
- Python 实现简单的单向链表
- 单向链表的python实现
- python实现单向链表连
- Python 实现有序单向链表
- Python实现的单向循环链表功能示例
- Python 实现带头尾指针的单向链表
- Python实现基础数据结构--单向链表
- python3实现单向链表
- 基于Python单向链表实现尾部、任意位置添加,删除
- python实现单向链表
- Python 实现单向链表
- Python中的单向链表如何实现?
- 浅谈Python单向链表的实现
- python实现单向链表
- python实现反转部分单向链表
- python实现单向链表
- python实现单向链表
- python实现单向链表详解
- 二叉树、list单向链表的实现( python版 Java版)-17-9-18
- python 单向链表实现