python链表
python实现链表依赖于类生成的实例,每个节点都是一个对象,组合在一起形成一个完整链表
对于node类只需关注两点:data 和 pnext
对于linked_list需要关心的:head,默认是node; length,列表的长度
链表的一些常用操作:
create_linked_list: init(),创建链表
is_empty():判断该链表是否为空
append(value):在链表末添加node/值
insert(value, index):插入
delete(index):删除
update(value, index):更新
get_value(index):查找
get_length():获取链表长度
clear():清空链表
print_linked_list():打印整个链表
class Node:
def __init__(self, data):
"""
node的初始化
:param data: 节点的数据
"""
self.data = data
self.pnext = None
def __repr__(self):
return str(self.data)
class LinkedList:
def __init__(self):
"""
Linked list 的初始化
"""
self.length = 0
self.head = None
def is_empty(self):
"""
判断该链表是否为空
:return: boolean
"""
return self.length == 0
def append(self, this_node):
"""
在链表末添加node/值,如果是node对象直接添加,否则先转换为node对象
:param this_node: 数据或者node对象
:return: None
"""
if isinstance(this_node, Node):
pass
else:
this_node = Node(data=this_node)
if self.is_empty():
# 链表为空的情况将头指针指向当前node
self.head = this_node
else:
node = self.head
while node.pnext:
node = node.pnext
node.pnext = this_node
self.length += 1
def insert(self, value, index):
"""
链表的插入操作
:param value: 要插入的值
:param index: 位置
:return: None
"""
if type(index) is int:
if index > self.length:
# 索引值超出范围直接提示并且退出
print("Index value is out of range.")
return
else:
# 获得当前node对象和head
this_node = Node(data=value)
current_node = self.head
if index == 0:
# 索引值为0是将
self.head = this_node
this_node.pnext = current_node
return
while index - 1:
current_node = current_node.pnext
index -= 1
# 这两条语句顺序很关键
# 将当前节点与后一个节点拆开,this_node指向后一个节点,前一个节点指向this_node
this_node.pnext = current_node.pnext
current_node.pnext = this_node
self.length += 1
return
else:
print("Index value is not int.")
return
def delete(self, index):
"""
删除链表中某个位置的节点
:param index: 位置索引
:return: None
"""
if type(index) is int:
if index > self.length:
# 索引值超出范围直接提示并且退出
print("Index is out of range.")
return
else:
if index == 0:
self.head = self.head.pnext
else:
current_node = self.head
while index - 1:
current_node = current_node.pnext
index -= 1
current_node.pnext = current_node.pnext.pnext
self.length -= 1
return
else:
print("Index value is not int.")
return
def update(self, value, index):
"""
为链表中某个位置的节点修改值
:param value: 要修改的值
:param index: 位置索引
:return: None
"""
if type(index) is int:
if index > self.length:
# 索引值超出范围直接提示并且退出
print("Index is out of range.")
return
else:
this_node = Node(data=value)
if index == 0:
this_node.pnext = self.head.pnext
self.head = this_node
else:
current_node = self.head
while index - 1:
current_node = current_node.pnext
index -= 1
this_node.pnext = current_node.pnext.pnext
current_node.pnext = this_node
return
else:
print("Index value is not int.")
return
def get_value(self, index):
"""
获取链表中某个位置节点的值
:param index: 位置索引
:return: 该节点值, int or not
"""
if type(index) is int:
if index > self.length:
# 索引值超出范围直接提示并且退出
print("Index is out of range.")
return
else:
if index == 0:
return self.head.data
else:
current_node = self.head
while index - 1:
current_node = current_node.pnext
index -= 1
return current_node.pnext.data
else:
print("Index value is not int.")
return
def get_length(self):
"""
获取链表长度
:return: int
"""
current_node = self.head
if current_node:
i = 1
while current_node.pnext:
current_node = current_node.pnext
i += 1
return i
else:
return 0
def clear(self):
"""
清空链表
:return: None
"""
self.head = None
self.length = 0
print("Clear the linked list finished.")
def print_linked_list(self):
"""
对整个链表的打印
:return: None
"""
if self.is_empty():
print("Linked list's length is 0")
else:
node = self.head
print("Head -->", node.data, end=' ')
while node.pnext:
node = node.pnext
print("-->", node.data, end=' ')
print("--> None. Linked node finished")
if __name__ == '__main__':
node1 = Node(data='node1')
node2 = Node(data='node2')
linked_list = LinkedList()
linked_list.append(node1)
linked_list.append(node2)
linked_list.print_linked_list()
linked_list.insert("sdf", 1)
linked_list.print_linked_list()
# linked_list.delete(0)
linked_list.update(value="update_test", index=2)
linked_list.print_linked_list()
print(linked_list.get_value(index=2))
print(linked_list.get_length())