python代码之双循环链表【内向即失败--王奕君】

代码是别人写的,我只是对它的方法做一个总结,告诉你双循环链表具体应该如何使用。
class Node:
    def __init__(self, data=None):
        self.data = data
        self.pre = None
        self.next = None

    def __repr__(self):
        return str(self.data)


class LinkList:
    def __init__(self):
        self.head = Node()
        self.tail = Node()
        self.head.next = self.tail
        self.tail.pre = self.head

    def __len__(self):
        length = 0
        node = self.head
        while node.next != self.tail:
            length += 1
            node = node.next
        return length

    def __repr__(self):
        return str(len(self))

    def append(self, data):
        node = Node(data)
        pre_node = self.tail.pre
        pre_node.next = node
        node.pre = pre_node
        self.tail.pre = node
        node.next = self.tail
        return node

    def get(self, index):
        """
        获取第index个值,若index>0正向获取else 反向获取
        :param index:
        :return:
        """
        length = len(self)
        index = index if index >= 0 else length +index
        if index >= length or index < 0: return None
        node = self.head.next
        while index:
            node = node.next
            index -= 1
        return node

    def insert(self, index, data):
        """
        因为加了头尾节点所以获取节点node就一定存在node.next 和 node.pre
        :param index:
        :param data:
        :return:
        """
        length = len(self)
        if abs(index + 1) > length:
            return False
        index = index if index >= 0 else index +1+length

        next_node = self.get(index)
        if next_node:
            node = Node(data)
            pre_node = next_node.pre
            pre_node.next = node
            node.pre = pre_node
            node.next = next_node
            next_node.pre = node
            return node

    def delete(self, index):
        node = self.get(index)
        if node:
            node.pre.next = node.next
            node.next.pre = node.pre
            return True
        return False


    def display_linklist(linklist):
        i = 0
        while i < len(linklist):
            data = linklist.get(i)
            i += 1


    def get_data_linklist(linklist):
        datas = []
        i = 0
        while i < len(linklist):
            node = linklist.get(i)
            datas.append(node.data[0])
            i += 1
        return datas


    def get_linklist_data(linklist):
        '''获取链表所有的数据'''
        data_list = []
        i = 0
        while i < len(linklist):
            data = linklist.get(i).data[0]
            data_list.append(data)
            i += 1
        return data_list
if __name__ == '__main__':
    ls = LinkList()
    ls.append('北')
    ls.append('上')
    ls.append('广')
    ls.append('深')
    ls.append('伤')
    ls.append('不')
    ls.append('起')
    print(ls.__len__())  #获取链表的个数
    print(ls.get_linklist_data()) #获取整个链表
    print(ls.append('啊'))    #追加一个啊
    print(ls.get_linklist_data())
    ls.delete(0)  #删除链表中第0个元素
    print(ls.get_linklist_data())
    ls.insert(0,['内向即失败']) #在第0个的地方插入一个元素
    print(ls.get_linklist_data())
    ls.append(['为何我输的这么惨']) #在最后一个的地方插入一个元素
    print(ls.get_data_linklist())
    print(ls.get(0).data)          #从链表中获取第0个元素
    print(ls.get_data_linklist())   #此时链表不会发生任何变化
    print(ls.get(-1))      #此时获取链表中最后一个元素
    #-------------------------------------------------------------#
    ls.get(-1).data[0]='为何要这样对我' #改变获取到的最后一个元素
    print(ls.get_linklist_data())

res:

7
['北', '上', '广', '深', '伤', '不', '起']

['北', '上', '广', '深', '伤', '不', '起', '啊']
['上', '广', '深', '伤', '不', '起', '啊']
['内向即失败', '上', '广', '深', '伤', '不', '起', '啊']
['内向即失败', '上', '广', '深', '伤', '不', '起', '啊', '为何我输的这么惨']
['内向即失败']
['内向即失败', '上', '广', '深', '伤', '不', '起', '啊', '为何我输的这么惨']
['为何我输的这么惨']
['内向即失败', '上', '广', '深', '伤', '不', '起', '啊', '为何要这样对我']

猜你喜欢

转载自blog.csdn.net/qq_37995231/article/details/81277335
今日推荐