链表操作之删除指定元素

链表操作之删除指定元素

​ 我们知道链表是一种受存储空间限制小的线性结构的存储方式,包含元素域和链接域两部分。其中最简单的的链表——单向链表,也是有元素域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__为入口程序,希望该文章对大家有帮助,不要忘记点赞欧!

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值