链表:
暗喻:链子,一环连着下一环,环环相连。
一个对象包含一个指针指向下一个与它连接的对象
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())