python实现单链表

2018-11-23  本文已影响0人  爱搞事的喵

链表的定义:
链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点。链表中的最后一个结点没有后继元素,其指针域为空。

如下所示:

信息域 指正域
(info) (link)

1.单链表结构

2.单链表的插入和删除示意图:

2. 单链表代码实现

class Node(object):
    def __init__(self,value,p=0):
        '''
        创建一个类的数据结构 代表链表的一个节点
        :param value: 数据域
        :param p: 指向下一个数据域的指针
        '''
        self.data = value
        self.next = p

class LinkList(object):
    def __init__(self):
        '''
        初始化链表头部
        '''
        self.head = 0
    def __setitem__(self, key, value):
        '''
        重新设置属性 key--value形式
        :param key:
        :param value:
        :return:
        '''
        if self.is_empty():
            print('linklist is empty')
        elif key < 0 or key > self.getLength():
            print("the given key is error")
        else:
            self.delete(key)  #删除对应的key--value
            self.insert(value,key) #重新设置新的key--value

    def __getitem__(self, key):
        '''
        通过key 获取value
        :param key:
        :return:
        '''
        if self.is_empty():
            print('linkList is empty')
        elif  key < 0 or key > self.getLength():
            print('the given key is error')
        else:
            return self.getItem(key)


    def initList(self,data):
        '''
        初始化单链表
        :param data: 需要初始化的列表
        :return:
        '''
        self.head = Node(data[0])
        p = self.head
        for i in data[1:]:
            node = Node(i)
            p.next = node
            p = node
            # p = p.next  #or p = node


    def insert(self,value,key):
        '''
        将数据插入指定位置key  获取插入之前的位置的节点node 和插入数据后面的节点node
        :param value: 插入节点的值
        :param key: 插入节点的索引
        :return:
        '''
        if self.is_empty():
            print("linkList is empty")
        elif key < 0 or key > self.getLength():
            print("the given key is error")
        else:
            '''如果key == 0'''
            if key == 0:
                q = Node(value,self.head)
                self.head = q
                print('---------index---------')
            else:
                p = self.head
                post = self.head
                j = 0
                while p.next != 0 and j < key:
                    post = p
                    p = p.next
                    j += 1
                if j == key:
                    node = Node(value,key)
                    post.next = node
                    node.next = p
                    print('----------------------')

    def delete(self,key):
        if self.is_empty():
            print('linkList is empty')
            return
        if key < 0 or key > self.getLength():
            print('the given key is error')
            return
        if key == 0:
            # node = Node(self.getItem(key),key)
            # self.head = node
            self.head = self.head.next
        else:
            p = self.head
            post = self.head
            j = 0
            while p.next != 0 and j < key:
                post = p
                p = p.next
                j += 1
            if j == key:
                post.next = p.next

    def append(self,value,key):
        '''
        添加数据 在链表的尾部
        :param value:
        :param key:
        :return:
        '''
        node = Node(value,key)
        if self.head == 0:
            self.head = node
        else:
            p = self.head
            while p!=0:
                p = p.next
            p.next = node

    def is_empty(self):
        '''
        判断链表是否为空
        :return:
        '''
        if self.getLength() == 0:
            return True
        else:
            return False

    def getItem(self,key):
        '''
        根据提供的key 索引查找对应的节点 node.data
        :param key:
        :return:
        '''
        if self.is_empty():
            print('linkList is empty')
            return
        p = self.head
        j = 0
        while p.next != 0 and j<key:
            p = p.next
            j += 1

        if j == key:
            return p.data
        else:
            print('the data is not exist')
            return


    def getLength(self):
        '''
        获取链表的长度
        :return:
        '''
        p = self.head
        length = 0
        while p != 0:
            length += 1
            p = p.next
        return length

    def index(self,value):
        '''
        根据值获取对应的索引 默认只匹配第一个值
        :param value: 
        :return: 
        '''
        if self.is_empty():
            print('linkList is empty')
            return
        p = self.head
        j = 0
        while p.next != 0 and not p.data == value:
            p = p.next
            j += 1
        if p.data == value:
            return j
        else:
            return -1

    def clear(self):
        self.head = 0

link = LinkList()
arr = [1,2,3,4,5,6,3,4,3]
link.initList(arr)

link.insert(10,0)

print(link.getItem(0))








上一篇 下一篇

猜你喜欢

热点阅读