单向链表代码实现

单向链表代码实现

在这里插入图片描述


'''
Author: jiaona.chen jiaona.chen@greatopensource.com
Date: 2022-06-02 13:18:06
LastEditors: jiaona.chen jiaona.chen@greatopensource.com
LastEditTime: 2022-06-03 16:07:34
FilePath: /opt/gap-robot/link.py
'''


class ListNode(object):
    def __init__(self,elem) -> None:
        self.elem = elem
        self.next = None


class SingleList(object):
    def __init__(self,node = None) -> None:
        """
        单向链表
        可以有初始值node
        """
        self.__head = node

    def is_empty(self) -> bool:
        """
        链表是否为空,返回一个布尔值
        :returns true/false
        """
        return self.__head == None

    def length(self) -> int:
        """
        链表的长度
        返回一个整数,如果链表为空,返回0,如果链表不为空,则求出链表的长度
        :return int
        """
        if self.is_empty():
            return 0
        else:
            count = 0
            cur = self.__head
            while cur != None:
                count += 1
                cur = cur.next
        return count
        
    def travel(self):
        """
        遍历链表,如果链表为空,则输出""
        :returns 没有返回值
        """
        if self.is_empty():
            print("")
        else:
            cur = self.__head
            while cur != None:
                print(cur.elem,end=" ")
                cur = cur.next
        print("")

    def append(self,node):
        """
        在链表的尾部添加元素
        先初始化一个node并赋值遍历链表,当遇到链表的next是None时,
        表示此节点是链表的尾部,再将此节点的next指针指向新添加的node
        """
        node = ListNode(node)
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next  != None:
                cur = cur.next

            cur.next =  node

    
    def add(self,item):
        """
        在链表头部插入元素,头插法
        step1: 初始化一个新的node,将新的node的next指向头部元素
        step2: 再将新node的元素部分指向头节点
        :param item 
        """
        node = ListNode(item)
        node.next = self.__head
        self.__head = node

    def insert(self,pos,item):
        """
        在指定的位置上插入元素
        step1: 如果pos小于0或等于0,则被定义为是在头部插入,采用头插法
        step2: 如果pos大于等于Length,则被定义为是在尾部插入,采用尾插法
        step3: 定义一个新的Node
        step4: 元素的下标是从0开始的,先将新Node的next指向元素下标为pos的节点
        step5: 再将新的Node的元素部分指向pos前一个的next处
        """
        if pos <= 0:
            self.add(item)
        elif pos >= self.length() -1 :
            self.append(item)
        else:
            node = ListNode(item)
            count = 0
            cur = self.__head
            while count  < (pos-1):
                cur = cur.next
                count += 1
            node.next = cur.next
            cur.next = node
            
    def search(self,pos) -> int:
        """"
        根据下标返回对应的值
        step1: 如果pos小于等于0,则只返回链表的头节点
        step2: 如果pos大于等于链表的长度,则返回数组越界的错误
        """
        if pos <= 0:
            return self.__head.elem
        elif pos >= self.length() - 1:
            return "list index out of range"
        else:
            count = 0
            cur =self.__head
            while count < pos:
                cur = cur.next
                count += 1
            return cur.elem
    
    def remove(self,item):
        """
        删除一个元素
        遍历链表,如果此元素在链表里,则将该节点的前一个节点的Next指向该节点的后一个元素 
        step1: 定义两个指针,pre,cur,pre表示删除item的前一个node,cur表示item的下一个node
        step2: 当cur指针的next不为None是,则一直遍历
        """
        cur = self.__head
        pre = None
        count = 0
        while cur != None:
            count += 1
            # 判断item是否在链表里
            if cur.elem == item:
                # 如果正好删除的是头节点,则需要将self.__head指向下一个值
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next
        return count                             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值