在单向链表的尾部插入一个元素
博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!
一、题目
在单向链表 L 尾部插入一个元素。
注意,在设置尾指针指向新节点之前,设置尾节点的“next”指针指向新节点。当向一个空链表中插入新节点时,需要考虑空链表不存在尾节点的情况。
二、基本思想
1、创建一个新的节点;
2、将新节点的数据域设置为新元素,将该节点的 “next” 指针设置为空;
3、设置尾节点的 “next” 指针指向新节点;
4、更新尾指针指向新节点。
三、图示
四、代码示例
"""
1、在单向链表 L 的头部插入一个元素。
注意:要在为新节点分配 L.head 变量之前设置新节点的“next” 指针。
如果初始列表为空(即 L.head 为空),那么就将新节点的“next” 指针指向空(None)。
2、在单向链表的尾部插入一个元素。
注意:在设置尾指针指向新节点之前,设置尾节点的“next”指针指向原来的尾节点。
当向一个空链表中插入新节点时,需要考虑空链表不存在尾节点的情况。
3、从单向链表中删除一个元素。
4、删除单向链表的第一个元素。
"""
class Empty(Exception):
"""
试图从空容器中访问元素时出错
"""
pass
class Node(object):
"""
节点类
"""
def __init__(self, element, next=None): # 初始化节点的字段
self.element = element # 元素引用
self.next = next # 指向下一个节点的引用
class SingleLinkList(object):
"""单向链表"""
def __init__(self):
self.head = None # 头节点
self.size = 0 # 链表元素个数
def init(self, data):
"""
初始化链表
:param data: 需要初始化的列表
:return:
"""
self.head = Node(data[0])
cur = self.head
for i in data[1:]:
node = Node(i)
cur.next = node
cur = cur.next
def len(self):
"""
返回链表元素个数
:return:
"""
return self.size
def is_empty(self):
"""
判断链表是否为空
:return: 如果是空链表,返回真
"""
return self.size == 0
def push(self, e):
"""
在单向链表的头部插入一个元素
Inserts an element in the header of a unidirectional linked list
:param e: 新插入的元素 The newly inserted element
:return:
"""
# 创建并链接一个新节点
self.head = Node(e, self.head)
self.size += 1
# 等价于:
# 创建新的节点实例,存储对元素e的引用
# node = Node(e)
# 设置新节点的“next”引用旧的头节点
# node.next = self.head
# 设置变量头以引用新节点
# self.head = node
# self.size += 1
def append(self, e):
"""
在单向链表的尾部插入一个元素
Inserts an element at the end of a unidirectional linked list
:param e: 新插入的元素 The newly inserted element
:return:
"""
# 创建新的节点实例,存储对元素e的引用
node = Node(e)
# 设置新节点的“next”引用 None 对象
node.next = None
# 判断链表是否为空
if self.is_empty():
self.head = node
else:
# 获取尾节点
# get tail node
cur = self.head
while cur.next is not None:
cur = cur.next
# 设置尾节点的“next”指向新节点
# set the next of the tail node to point to the new node
cur.next = node
def remove(self, e):
"""
从单向链表中删除一个元素
To remove an element from a unidirectional linked list
:param e: 需要删除的元素 Elements that need to be removed
:return:
"""
cur = self.head
pre = None
while cur is not None:
if cur.element == e: # 找到要删除的元素
# 要删除的元素位于链表头部
if cur == self.head:
self.head = cur.next
else:
pre.next = cur.next
return
# 未找到要删除的元素,移动游标
pre = cur
cur = cur.next
def top(self):
"""
返回单向链表的第一个元素
:return:
"""
if self.is_empty():
raise Empty("Stack is empty")
return self.head.element
def pop(self):
"""
删除单向链表的第一个元素
:return:
"""
if self.is_empty():
raise Empty("Stack is empty")
answer = self.head.element
self.head = self.head.next
self.size -= 1
return answer
def travel(self):
"""
遍历链表
:return: 链表的每一个元素
"""
cur = self.head
while cur is not None:
print(cur.element, end=" ")
cur = cur.next
print("")
if __name__ == "__main__":
link_list = SingleLinkList()
print("初始化单向链表:")
link_list.init(["MSP", "ATL", "BOS"])
link_list.travel()
print("在单向链表头部插入元素 LAX:")
link_list.push("LAX")
link_list.travel()
print("在链表的尾部插入元素 MIA:")
link_list.append("MIA")
link_list.travel()
print("删除链表中的节点 ATL:")
link_list.remove("ATL")
link_list.travel()
print("获取链表中的第一个节点元素:")
print(link_list.top())
print("删除链表中的第一个元素{}:".format(link_list.pop()))
link_list.travel()
# 运行结果:
# 初始化单向链表:
MSP ATL BOS
# 在单向链表头部插入元素 LAX:
LAX MSP ATL BOS
# 在链表的尾部插入元素 MIA:
LAX MSP ATL BOS MIA
# 删除链表中的节点 ATL:
LAX MSP BOS MIA
# 获取链表中的第一个节点元素:
LAX
# 删除链表中的第一个元素LAX:
MSP BOS MIA