Python 单链表实现

概念: 什么是单链表

链表是一种动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点”,

每一个结点都是由数据域和指针域组成的。跟数组不同链表不用预先定义大小,而且硬件支持的话可以无限扩展。

 

 

 代码: 

 

"""
author: zhao xian xin

不积跬步无以至千里

"""


# 设置 每一个链表的结点
class Node(object):
    """
    链表节点类
    """

    def __init__(self, item):
        self.element = item
        self.next = None


# 设置  链表得 方法
class SingleLinkList(object):
    """
    链表 公用 函数方法
    """
    """ 初始化链表 """
    def __init__(self):
        self.header = None
        self.length = 0


    """ 链表头部添加元素 """
    def firstAdd(self, node):
        if self.header == None:
            self.header = node
        else:
            node.next = self.header
            self.header = node
        self.length += 1


    """ 链表尾部添加元素 """
    def tailAdd(self, node):
        if self.header == None:
            self.header = node
        else:
            currentNode = self.header
            while currentNode.next != None:
                currentNode = currentNode.next
            currentNode.next = node
        self.length += 1


    """ 遍历链表 """
    def rangeList(self):
        try:
            assert self.length != 0, "链表为空"
        except:
            print("ok")
        currentNode = self.header
        for i in range(0, self.length):
            eleNum = currentNode.element
            currentNode = currentNode.next
            print(eleNum, end=" ")


    """ 插入节点到对应得位置 """
    def insertNode(self, index, node):
        if self.length <= index <= 0:
            raise ValueError()
        else:
            """ 需要考虑 for 循环 得 range """
            if index == 1:
                self.firstAdd(node)

            elif index == 2:
                node.next = self.header.next
                self.header.next = node
                self.length += 1

            else:
                currentNode = self.header
                for i in range(1, index - 1):
                    currentNode = currentNode.next
                node.next = currentNode.next
                currentNode.next = node
                self.length += 1


    """ 结点之间排序 排序的方式 不需要交换节点之间的位置 
        只需要 交换节点之间值就可以了 用到了快速排序
    """
    def sortList(self):
        if self.header == None:
            raise ValueError()
        else:
            """ 快速排序 方式 实现 """
            for i in range(0, self.length):
                currentNode = self.header
                for j in range(0, self.length - i -1):
                    if currentNode.element > currentNode.next.element:
                        mid = currentNode.element
                        currentNode.element = currentNode.next.element
                        currentNode.next.element = mid
                    currentNode = currentNode.next


    """ 通过索引得 位置 删除 """
    def deleteNode(self, index):
        if self.header == None:
            raise ValueError()
        else:
            if index == 1:
                self.header = self.header.next
            elif index == 2:
                self.header.next = self.header.next.next
            else:
                currentNode = self.header
                for i in range(1, index - 1):
                    currentNode = currentNode.next
                currentNode.next = currentNode.next.next
        self.length -= 1





if __name__ == "__main__":
   # 声明结点, 头部添加元素 node1
= Node(1) single_link_list = SingleLinkList() # 实例化 single_link_list.firstAdd(node1) print(single_link_list.rangeList())   # 生命节点, 尾部添加元素 single_link_list.tailAdd(Node(2)) print(single_link_list.rangeList())   # 声明结点, 在指定位置插入元素 single_link_list.insertNode(2, Node(3)) print(single_link_list.rangeList())   #声明结点, 结点排序 single_link_list.tailAdd(Node(1)) single_link_list.sortList() print(single_link_list.rangeList())

 

 

额外小知识: assert 断言 当条件为假时会触发

 

posted @ 2020-09-03 11:45  Black_Climber  阅读(254)  评论(0编辑  收藏  举报