您的位置:首页 > 编程语言 > Python开发

单向链表的Python实现

2017-09-01 11:39 459 查看
链表简介

单向链表

具体实现
节点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数据结构——链表的实现】

由于本人水平有限,难免出现错漏之处,欢迎批评指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息