链表操作之删除指定元素
我们知道链表是一种受存储空间限制小的线性结构的存储方式,包含元素域和链接域两部分。其中最简单的的链表——单向链表,也是有元素域item和链接域next组成。而为了方便查找出整条链表,就需要定义一个变量head指向链表的头结点(首结点),依此再通过链接域,找到链表中的所有元素。
在开始正式内容前,先做一些准备:
1、定义单个节点:
class SingleNode:
"""链表结点实现"""
def __init__(self, item):
# item: 存放元素
self.item = item
# next: 标识下一个结点
self.next = None
2、构建链表类
class SingleLinkList:
"""单链表的实现"""
def __init__(self, node=None):
# 首结点
self.head = node
def is_empty(self):
# 判断链表是否为空
if self.head == None:
return True
else:
return False
# 尾部增加结点
def append(self, item):
# 新结点存储新数据
node = SingleNode(item)
if self.is_empty():
self.head = node
else:
cur = self.head
while cur.next is not None:
cur = cur.next
# 当前结点后面连接新结点
cur.next = node
# 遍历链表
def travel(self):
cur = self.head
while cur is not None:
print(cur.item)
cur = cur.next
思路:想要删除当前位置的结点cur,很简单,把下一位置的数据和前一位置的数据关联起来就可以,把当前位置屏蔽就实现了删除操作。也就是说我们还需要前一位置pre的辅助:
pre.next = cur.next
但是有一个问题是,要是前一位置pre为None,那不是就铁定报错了吗,要是空链表同样报错。先处理前一位置pre为None的head头部结点。删头部结点也可以,令其下一个节点作为新的头部结点就可以:
self.head = cur.next
这样就把所有等于指定元素的情况,处理完了。若当前位置内容不等于指定内容,就移动当前位置指针,把当前位置交给pre,再去下一位置:
pre = cur
cur = cur.next
若链表为空就不需要执行删除操作,可以设置若头部结点不为时在执行上面的操作。如:
cur = self.head
while cur is not None:
# 我们的程序
综上所述可以完成拼接:
class SingleNode:
"""链表结点实现"""
def __init__(self, item):
# item: 存放元素
self.item = item
# next: 标识下一个结点
self.next = None
class SingleLinkList:
"""单链表的实现"""
def __init__(self, node=None):
# 首结点
self.head = node
def is_empty(self):
# 判断链表是否为空
if self.head == None:
return True
else:
return False
# 尾部增加结点
def append(self, item):
# 新结点存储新数据
node = SingleNode(item)
if self.is_empty():
self.head = node
else:
cur = self.head
while cur.next is not None:
cur = cur.next
# 当前结点后面连接新结点
cur.next = node
# 遍历元素
def travel(self):
cur = self.head
while cur is not None:
print(cur.item)
cur = cur.next
# 删除结点
def remove(self, item):
# 从头结点开始
cur = self.head
# 头结点的前一个节点为None
pre = None
while cur is not None:
# 找到要删除的结点
if cur.item == item:
# 若删除是头结点
if cur == self.head:
self.head = cur.next
else:
pre.next = cur.next
break
# 没有找到要删除的元素
else:
pre = cur
cur = cur.next
if __name__ == '__main__':
linked_list = SingleLinkedList()
# 添加元素
linked_list.append('唐僧')
linked_list.append('孙悟空')
linked_list.append('猪八戒')
linked_list.append('沙和尚')
linked_list.travel()
print('-'*80)
# 删除结点
linked_list.remove('沙和尚')
linked_list.travel()
其中__main__为入口程序,希望该文章对大家有帮助,不要忘记点赞欧!