介绍
- 链表有一个个结点Node连接而成每个结点都包含数据域(Data)和指针域(Next),适合插入和删除频繁的结构。
头结点:指向链表的第一个结点
尾结点:指向链表的最后一个结点
None:链表最后一个结点的指针域,为空
- 单链表:每个结点的指针域指向下一个结点,链表无环
- 双向链表:每个结点有两个指针域,分别指向前一个和后一个结点
- 单项循环链表:链表的尾指针域指向头结点,链表有环,遍历不会出现None
以单链表为例实现链表的各种操作
Node.py
# 定义一个结点类
class Node:
def __init__(self,data=''):
self.data = data
self.next = None
return
def has_value(self, value):
if self.data == value:
return True
else:
False
linkList.py
# 定义一个链表类
from Node import Node
class linkList:
def __init__(self):
"""
初始化方法
:param head: 头结点
:param tail: 尾结点
:param length: 链表长度
:return
"""
self.head = None
self.tail = None
self.length = 0
return
def is_empty(self):
"""
判断链表是否为空
"""
if self.length != None:
print('链表长度为:{}'.format(self.length))
return True
else:
print('链表为空')
return False
def add_node(self, item):
"""
在表尾添加节点
:param item: 要插入的节点
:return :
"""
# 判断item是否为Node类型
if not isinstance(item, Node):
item =Node(item)
if self.head is None:
# 链表为空则头插
self.head = item
else:
#链表不为空则尾插
node = self.head
while node.next != None:
node = node.next # 找到链尾
if node.next == None:
self.tail = node
self.tail.next = item
item = self.tail
self.length += 1
return
def insert_node(self, index, data):
"""
添加节点
:param index: 位置
:param data: 值
:return :
"""
if self.is_empty() == False:
print("这是一个空链表")
return
index = int(index)
if index < 0 or index >= self.length:
print("插入位置有误")
return
item = Node(data)
int(index)
# 在表头插入
if index == 1:
item.next = self.head
self.head = item
self.length += 1
return
j=0
node = self.head
prev = self.head
# 找到索引位置的结点
while node.next and j < index:
prev = node
node = node.next
j += 1
# 插入结点
if j == index:
item.next = node
prev.next = item
self.length += 1
def delete_node_byid(self, item_id):
"""
通过索引删除结点:将待删除结点 的前一个结点的 next域指向待删除结点next(断链衔接)
:param item_id: 待删除结点索引
:return :
"""
id = 1
current_node = self.head # 将头结点设置为当前结点,即从头结点开始找
previous_node = None # 头结点的前一个结点为空
# print(type)
while current_node is not None:
print(f"{current_node.data} , {current_node.next}")
if id == int(item_id):
if previous_node is not None:
previous_node.next = current_node.next # 断链衔接
else:
self.head = current_node.next # 删除头结点
return
# 没找到就继续找
previous_node = current_node
current_node = current_node.next
id = id + 1
self.length -= 1
return
def find_node(self, value):
"""
通过数值寻找结点
:param value: 值
:return : 查找到的结点
"""
current_node = self.head
node_id = 1
results = []
while current_node is not None:
if current_node.has_value(value):
results.append(node_id)
current_node = current_node.next
node_id = node_id + 1
print("该元素索引为{}".format(results))
def print_link(self):
"""
遍历输出
"""
current_node = self.head
print("当前链表为:")
while current_node is not None:
print(current_node.data)
current_node = current_node.next
return
userInterface.py
python中没有switch-case 文档指示使用if-elif实现
# 简单的做一个操作引导
from Node import Node
from linkList import linkList
def user_choice():
key = input("\n请选择要执行的操作:1.新建单链表 2.插入结点 3.通过位置删除结点 4.通过数值查找结点 5.遍历输出\n")
return key
def user(key, linklist):
if key == '1':
i = 1
massage = ""
while True:
massage = input('\n请输入第{}个要存储的信息(输入\\q返回,exit退出):\t '.format(i))
if massage == '\\q':
break
else:
node = Node(massage)
linklist.add_node(node)
i += 1
elif key == '2':
index = input('请输入要插入的位置索引(输入q返回,exit退出):')
value = input('请输入要插入的值:')
linklist.insert_node(index, value)
elif key == '3':
index = input('请选择要删除的位置索引(输入q返回,exit退出):')
linklist.delete_node_byid(index)
elif key == '4':
value = input('请选择要查找的值(输入q返回,exit退出):')
linklist.find_node(value)
elif key == '5':
linklist.print_link()
run.py
# 程序启动入口
from userInterface import *
if __name__ == '__main__':
massage = ''
linklist = linkList()
while massage != 'exit':
key = user_choice()
user(key, linklist)
massage = key
print('Bye')