• 链表


    链表:
    暗喻:链子,一环连着下一环,环环相连。
    一个对象包含一个指针指向下一个与它连接的对象
    node(0)-->node(1)--->node(2)....node(n)->None

    链表的基本元素有:
    • 节点:每个节点有两个部分,左边部分称为值域,用来存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
    • head:head节点永远指向第一个节点
    • tail: tail永远指向最后一个节点
    • None:链表中最后一个节点的指针域为None值

    class Node:
    
        def __init__(self, value, next=None):
            self.value = value
            self.next = next
    
    
    node1 = Node(1)
    # node2 = Node(2)
    # node3 = Node(3)
    #
    # node1.next = node2
    # node2.next = node3
    
    
    # 链表的长度
    # 链表里面插入一个元素,1)在最前面插入 2)在最后面插入
    # 链表里面删除一个元素
    # 链表里面找一个元素
    class LinkChain:
    
        def __init__(self, head=None):
            self.head = head
    
        def __len__(self):
            count = 0
            while self.head:  # 结束循环的时候,一定最后找到None了
                count += 1
                self.head = self.head.next
            return count
    
        def insert_front(self, node):
            if self.head is None:
                self.head = node
                return
            node.next = self.head  # 将新插入节点的下一个节点
            # 设定为当前链表的头结点
            self.head = node  # 将链表的头结点设定为新插入的节点
    
        def append(self, node):
            if self.head is None:  # 判断当前链表是否为空
                self.head = node  # 为空,直接插入就可以了
                return
            cur_node = self.head  # 不为空的情况下,从head开始遍历
            while cur_node:  # 表示node有内容,不是None
                if cur_node.next is None:  # 找到某个节点,它的next是None
                    # 表示它是链表的最后一个节点
                    cur_node.next = node  # 把新节点挂到最后一个节点
                    break  # 结束循环
                cur_node = cur_node.next  # 将下一个节点设定为当前节点
    
        def find(self, value):
            node = self.head
            while node:  # 表示node有内容,不是None
                if node.value == value:
                    return node
                node = node.next
            return None
    
        def get_all(self):
    
            node = self.head
            all = []
            while node:  # 表示node有内容,不是None
                all.append(node.value)
                node = node.next
            return all
    
        # 1 2 3--->1.next->3
        def delete_node(self, value):
            if self.head.value==value:
                self.head = self.head.next
                return
            node = self.head
            tail = node.next
            while node:  # 表示node有内容,不是None
                if tail.value == value:
                    node.next = tail.next  # 如果tail是最后一个,那它的
                    # 它的next一定是None,直接复制给
                    # node.next即可
                    break
                node = node.next
                tail = node.next
    
    
    if __name__ =='__main__':
    
        l = LinkChain(node1)
        l.insert_front(Node(2))
        l.append(Node(5))
        print(l.get_all())
        print(l.find(5).value)
        print("_____")
        l.delete_node(5)
        print(l.get_all())
  • 相关阅读:
    VS2010如何以管理员权限启动? 转载
    ArcGIS属性编辑字符型字段值出现乱码问题
    点批量移动到线上(ArcGis版) 转载
    C#判断数据库中取出的字段值是否为空(NULL) .
    方框内打勾(钩)的符号(word和excel)
    C# 获取屏幕的大小
    神通数据库的备份和还原
    推荐系列文章:《DotText源码阅读》
    Lucene.Net 2.3.1开发介绍 —— 阅读索引(转载)
    Lucene.Net:使用eaglet的盘古分词进行分词和搜索(转载)
  • 原文地址:https://www.cnblogs.com/ff-gaofeng/p/12097334.html
Copyright © 2020-2023  润新知