[数据结构]总结---链表

2019-04-03  本文已影响0人  何学诚
1.今天总结一下链表这种数据结构

链表是一种很简单的数据结构,但是很实用。在区块链中,所有的链都是以链的方式相互连接的。
简单的说,单链表包括两个部分,第一个部分包括自己的信息,第二部分指向下一个节点的指针。


单链表.png
2.简单介绍一下操作
2.1 节点的信息,value保存信息,next指向下一个节点。
class Node(object):
    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next
2.2 初始化,新建一个根节点,并设置最大长度,将链表长度和尾节点初始化
 # 初始化
    def __init__(self, maxsize=None):
        self.maxsize = maxsize
        self.root = Node()
        self.tail_node = None
        self.length = 0
2.3 从末尾添加一个节点(要注意的地方就是判断链表本身是否为空,然后直接从tailnode节点添加)
 # 从右侧增加一个节点
    def append(self, value):
        if self.maxsize is not None and len(self) >= self.maxsize:
            raise Exception('LinkedList is Full')
        # 新建节点
        node = Node(value)
        tail_node = self.tail_node
        # 更新上一节点next(之前的尾节点)
        if tail_node is None:  # 如果末尾是空的
            self.root.next = node
        else:  # 加到最后
            tail_node.next = node
        # 更新尾节点
        self.tail_node = node
        self.length += 1
2.4 从左侧添加一个节点,还是需要判断尾节点tailnode是否为空
  # 从左边增加一个节点
    def append_left(self, value):
        if self.maxsize is not None and len(self) >= self.maxsize:
            raise Exception('LinkedList is Full')
        node = Node(value)
        # 如果是空的话,直接将node
        if self.tail_node is None:
            self.tail_node = node
        # 不是空,更换root指向的值
        head_node = self.root.next
        self.root.next = node
        node.next = head_node
        self.length += 1
2.5 在某一“value”后插入一节点。
 def insert(self, value, new_value):
        '''
        在某一值后插入新的值
        :param value: 旧值
        :param new_value: 需插入的新值
        '''
        for node in self.iter_node():
            if node.value is value:
                # 必须每次插入时,新建一个new_node
                new_node = Node(new_value)
                new_next = node.next
                # 当到最后一个时,必须更新tail_node
                if node.next is None:
                    self.tail_node = new_node
                node.next = new_node
                new_node.next = new_next
2.6 从尾删除节点
    def pop(self):
        # 获取长度
        length = self.length
        # 当空
        if length is 0:
            raise Exception("The LinkList is empty")
        # 当仅一个节点时
        elif length is 1:
            self.root.next = None
            self.length = 0
            self.tail_node = None
        # 大于两个节点时候
        length -= 1
        index = 1
        head_node = self.root.next
        # 找到节点
        while index is not length:
            length += 1
            head_node = head_node.next
        # 删除节点
        del head_node.next
        self.tail_node = head_node
2.7 从开头处删除节点
    def popleft(self):
        # 判断链表是否为空
        if self.root.next is None:
            raise Exception("The LinkList is empty")
        # 获取后一节点next值
        head_node = self.root.next
        self.root.next = head_node.next
        self.length -= 1
        value = head_node.value
        # 判断是否为唯一节点,处理尾部
        if self.tail_node is head_node:
            self.tail_node = None
        del head_node
        return value
3.完整代码

查看链接:
https://github.com/Wind0ranger/LeetcodeLearn/blob/master/1-List/Linklist.py

上一篇下一篇

猜你喜欢

热点阅读