链表

链表:
暗喻:链子,一环连着下一环,环环相连。
一个对象包含一个指针指向下一个与它连接的对象
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())
posted @ 2019-12-25 16:18  风声~~  阅读(149)  评论(0编辑  收藏  举报