数据结构:单(向)链表(Python实现)

定义了单向链表的结点类,单向链表类及其一些方法,以及有一些测试

class node(object):
    def __init__(self,value):
        self.item=value
        self.next=None
#链表的处理完整性考虑顺序:
# 一般结点(中间点),空链表,头结点,单个节点的头结点,尾结点,单个结点的尾结点。
# [单个节点既可以被看成头结点也可以看成尾结点]
# (明显例子:单向循环链表的remove)
class singlelinklist(object):
    def __init__(self,node=None):
        self.__head=node
    def isempty(self):
        '''判断链表是否为空'''
        return self.__head==None#用is None会好一点,编译器不会下划线警告
    def len(self):
        '''返回链表长度'''
        '''指针遍历计数'''
        count=0
        cur=self.__head
        while cur!=None:
            count+=1
            cur=cur.next
        return count
    def travel(self):
        cur=self.__head
        while cur!=None:
            print(cur.item,end=" ")
            cur=cur.next
        print()
    def append(self,value):
        '''尾部添加结点'''
        newnode=node(value)
        cur=self.__head
        if self.isempty():
            self.__head=newnode
        else:
            while cur.next!=None:
                cur=cur.next
            cur.next=newnode
    def add(self,value):
        '''头部添加结点'''
        newnode=node(value)
        newnode.next=self.__head
        self.__head=newnode
    def insert(self,index,value):
        '''指定位置插入节点'''
        newnode=node(value)
        n=self.len()
        if index<=0:
            self.add(value)
            return
        if index>n-1:
            self.append(value)
            return
        cur=self.__head
        count=0
        while count<index-1:
            count+=1
            cur=cur.next
        newnode.next=cur.next
        cur.next = newnode
    def remove(self, value):
        '''删除左边第一个与指定值相同的结点'''
        cur = self.__head
        pre = None
        while cur!=None:#空链表直接不执行
            if cur.item==value:
                if cur==self.__head:#头结点,包括了单一头结点
                    self.__head=cur.next
                    break
                else:
                    pre.next=cur.next
                    break
            else:
                pre=cur
                cur=cur.next
    def search(self,value):
        '''查找某结点是否在链表中,返回TRUE/False'''
        cur=self.__head
        while cur!=None:
            if cur.item==value:
                return True
            cur = cur.next
        return False
    def found(self,value):
        '''找到指定元素的下标(实际链表无下标)'''
        cur = self.__head
        count=0
        while cur!=None:
            if cur.item == value:
                return count
            cur = cur.next
            count += 1

if __name__=='__main__':
    ll=singlelinklist()
    print(ll.isempty())
    print(ll.len())

    ll.append(1)
    print(ll.isempty())
    print(ll.len())

    ll.append(2)
    ll.add(8)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.append(6)#8 1 2 3 4 5 6
    ll.travel()
    ll.insert(-1,9)#9 8 1 2 3 4 5 6
    ll.travel()
    ll.insert(3, 100)# 9 8 1 100 2 3 4 5 6
    ll.travel()
    ll.insert(10, 200) # 9 8 1 100 2 3 4 5 6 200
    ll.travel()
    ll.remove(100)# 9 8 1 2 3 4 5 6 200
    ll.travel()
    ll.remove(9)# 8 1 100 2 3 4 5 6 200
    ll.travel()
    ll.remove(200)# 8 1  2 3 4 5 6
    ll.travel()
    print(ll.search(55))  # False
    print(ll.search(5))  # True
    print(ll.found(5))  # 5

测试结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值