• Python的单链表实现


    一、单向链表实现

    在单向链表结构中,每个节点包含两部分,元素部分和指针部分,其中元素部分即为节点的值,指针部分指向下一个节点或者None,另外,为了找到第一个节点,需要定义一个头结点head,它只含有指针,即指向头元素或者None 。

     

    类似于数组具有的增删查改等功能,我们希望单向链表具备这些基本功能,接下来开始自定义单向链表的基本功能。

    """定义节点"""
    class Node():
        def __init__(self, item):
            self.item = item
            self.next = None
    
    """定义单向链表"""
    class SingleList():
    
        """将头指针设为链表的私有属性"""
        def __init__(self, node=None):
            self.__head = node
    
        """判断是否为空"""
        def is_Empty(self):
            return self.__head == None
    
        """
        链表长度,通过遍历获得
        需要考虑特殊情况:链表为空时是否能够正确执行
        """
        def get_length(self):
            cur = self.__head
            count = 0
            while cur != None:
                count += 1
                cur = cur.next
            return count
    
        def traver(self):
            cur = self.__head
            while cur != None:
                print(cur.item, end=" ")
                cur = cur.next
            print()
    
    
        """
        头部添加元素
        需要考虑特殊情况:链表为空时是否能够正确执行
        """
        def addFirst(self, item):
            node = Node(item)
            node.next = self.__head
            self.__head = node
    
        """
        尾部添加元素,首先需要遍历找到最后一个元素
        需要考虑特殊情况:链表为空时是否能够正确执行
        """
        def addLast(self, item):
            node = Node(item)
            cur = self.__head
            if cur == None:
                self.__head = node
            else:
                while cur.next != None:
                    cur = cur.next
                cur.next = node
    
        """
        在指定位置添加元素,先找到添加的位置
        需要考虑特殊情况:在头部和尾部以及为空时能否正确执行
        """
        def insert(self, index, item):
            if index <= 0:
                self.addFirst(item)
            elif index >= self.get_length():
                self.addLast(item)
            else:
                node = Node(item)
                cur = self.__head
                count = 1
                while count < index:
                    cur = cur.next
                    count += 1
                node.next = cur.next
                cur.next = node
    
        """
        查找元素
        注意链表为空的特殊情况
        """
        def find(self, item):
            if self.is_Empty():
                print("链表为空,无法查找")
                return
            cur = self.__head
            i = 0
            while cur.next != None and not cur.item == item:
                cur = cur.next
                i += 1                   
            if cur.item == item:
                return("找到了,元素%s在%d处" %(item, i))
            else:
                return("没找到")
    
        """
        删除指定位置元素
        """
        def remove(self, index):
            if self.is_Empty():
                print("链表为空,无法删除")
                return
            if index < 0 or index > self.get_length():
                print("索引越界,请检查!")
                return
            cur = self.__head
            pre = None
            count = 0
            if index == 0:
                self.__head = cur.next
                return
            else:    
                while count != index:
                    pre = cur
                    cur = pre.next
                    count += 1
                pre.next = cur.next
                return
    
    
    if __name__ == "__main__":
        sl = SingleList()
        print(sl.is_Empty())
        sl.find(7)
        sl.insert(0,9)
        sl.traver()
        sl.addFirst(1)
        sl.traver()
        sl.addLast(2)
        sl.addLast(3)
        sl.addLast(4)
        sl.addLast(5)
        sl.addLast(6)
        sl.traver()
        sl.insert(-2, 21)
        sl.traver()
        sl.insert(20, 25)
        sl.traver()
        sl.insert(0, 15)
        sl.traver()
        sl.insert(2, 17)
        sl.traver()
        print(sl.find(7))
        print(sl.find(6))
        sl.remove(3)
        sl.traver()
        sl.remove(0)
        sl.traver()
        sl.remove(-1)
        sl.traver()
        sl.remove(20)
        sl.traver()

    测试结果为:

    True
    链表为空,无法查找
    9
    1 9
    1 9 2 3 4 5 6
    21 1 9 2 3 4 5 6
    21 1 9 2 3 4 5 6 25
    15 21 1 9 2 3 4 5 6 25
    15 21 17 1 9 2 3 4 5 6 25
    没找到
    找到了,元素6在9处
    15 21 17 9 2 3 4 5 6 25
    21 17 9 2 3 4 5 6 25
    索引越界,请检查!
    21 17 9 2 3 4 5 6 25
    索引越界,请检查!
    21 17 9 2 3 4 5 6 25

    单链表基本的增删改查等功能已基本实现,但代码还是有待改善优化

  • 相关阅读:
    resteasy和springmvc的区别
    队列
    栈的顺序存储和链式存储
    线性表链表存储结构(单链表)
    线性表顺序存储结构
    maven创建分model的工程
    使用throw和throws 引发异常
    手写web框架之加载Controller,初始化框架
    手写web框架之实现依赖注入功能
    Kruskal算法(贪心+并查集=最小生成树)
  • 原文地址:https://www.cnblogs.com/m-chen/p/10030051.html
Copyright © 2020-2023  润新知