Python实现数据结构——单链表及相关功能

本文详细介绍了如何使用Python编程语言实现单链表的基本操作,包括判断链表是否为空,计算链表长度,遍历节点,以及在头部、尾部和指定位置插入、删除和查找节点的功能。通过实例展示了链表的创建、修改和查询技巧。
摘要由CSDN通过智能技术生成

使用python语言实现单链表的判空,长度,遍历,增删改查等功能:

# 定义两个类,一个节点类,一个链表类
class Node(object):
    '''节点'''
    def __init__(self,elem):
        self.elem=elem
        self.next=None
        
class SingleLinkList(object):
    '''单链表'''
    def __init__(self,node=None):
        '''私有属性(.__)'''
        self.__head=node
        
    def is_empty(self):
        '''判断链表是否为空'''
        return self.__head==None
        
    def length(self):
        '''链表长度'''
#       先定义一个游标cur,cur最开始指向头节点
#       cur是用来遍历链表中节点的

        cur=self.__head
    
#       此时cur被赋值头节点,已经指向了头结点中的elem
#       print(cur)

        count=0
        while cur!=None:
            count+=1
            cur=cur.next
        return count
        
    def travel(self):
        '''遍历整个链表并输出每个节点存放的数值'''
        cur=self.__head
        while cur!=None:
            print(cur.elem)
            #注意此处cur也是一个节点类
            cur=cur.next
        
    def add(self,item):
        '''在链表头部添加节点'''
        node=Node(item)
        #有一个顺序问题,先把老链表首端赋值给新节点的next
        #再把全链表的首端指向新节点
        
        node.next=self.__head
        self.__head=node
        
    def append(self,item):
        '''在链表尾部添加节点'''
        #注意item给的是值,先创建一个节点去容纳这个值
        
        node=Node(item)
        
        #考虑一个特殊情况,空链表
        if self.__head==None:
            self.__head=node
        else:
            cur=self.__head
            while cur.next!=None:
                cur=cur.next
                
            #经过上述循环之后,当cur指向尾节点时退出循环
            #尾节点的next指向新节点,完成
            
            cur.next=node
        
    def insert(self,position,item):
        '''在pos位置处插入节点,pos从1开始,pos-1是其索引下标'''
        '''先考虑两个特殊情况'''
        pos=position+1
        if (pos-1)<1:
            #头插法
            self.add(item)
        elif pos >self.length():
            #尾插法
            self.append(item)
        else:
            count=1
            node=Node(item)
            cur=self.__head
            while count!=(pos-1):
                cur=cur.next
                count+=1
            #经过上述循环后,cur指向第count个(第pos-1个)节点
            #先将pos位置上的节点头赋值给新插入的节点尾
            node.next=cur.next
            #再将新插入的节点头赋值给pos-1位置上的节点尾
            cur.next=node        
        
    def remove(self,item):
        '''移除值为item的某个节点'''
        '''这里使用了两个游标,实际上用一个游标(.next.next)也可以实现'''
        bef_cur=self.__head
        cur=bef_cur.next
        if cur==None:
            #说明此链表中仅存在一个节点
            if bef_cur.elem==item:
                self.__head=None
                
        while cur.elem!=item:
            bef_cur=bef_cur.next
            cur=cur.next
        #经过上述循环之后cur指向的节点就是需要删除的节点
        #bef_cur指向的节点就是需要删除的节点之前的节点
        if cur.next==None:
            #说明需要删除的是尾节点
            bef_cur.next=None
        else:
            #说明需要删除的是中间节点
            bef_cur.next=cur.next
            
    def search(self,item):
        '''查找值为item的节点是否存在'''
        count=False
        cur=self.__head
        #特殊情况:空链表
        if cur==None:
            return count
        while cur!=None:
            if cur.elem!=item:
                cur=cur.next
                if cur==None:
                    return count
            else:
                count=True
                return count

测试代码:

ll=SingleLinkList()
# print(ll.is_empty())
# print(ll.length())

ll.append(1)
# print(ll.is_empty())
# print(ll.length())
ll.append(8)
ll.append(5)
ll.append(1)
ll.append(5)
ll.append(13)
ll.append(16)
ll.add(8)

print('***************')
print('测试length:')
print(ll.length())
print('***************')
print('测试travel:遍历')
ll.travel()
print('***************')
print('测试insert:在索引下标为2的地方插入999')
ll.insert(2,999)
ll.travel()
print('***************')
print('测试remove:移除999')
ll.remove(999)
ll.travel()
print('***************')
print('测试search:搜索18和5')
print(ll.search(18))
print(ll.search(5))
print('***************')

结果:

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值