数据结构 - 链表
链表
- 1. 单向链表
- 2. 双向链表
1. 单向链表
1.1 单向链表的概述
- 链表中每一个元素都是一个对象,每个对象称为一个节点,
- 包含有数据域key和指向下一个节点的指针next。通过各个节点之间的相互连接,最终串联成一个链表
节点的定义:
class Node(object): def __init__(self,data=None): self.data = data self.next = None
1.2 单链表的建立与遍历
头插法
#头插法 -> 带头结点的链表 (头结点什么也不存) class Node(object): def __init__(self,data=None): self.data = data self.next = None def create_linklist(li): head = Node() for val in li: p = Node(val) #创建节点 p.next = head.next #创建的节点的下一个节点为当前链表中头结点的下个节点 head.next = p #将p作为将头结点的下个节点 return head #头结点代表整个链表 #遍历整个链表 def traverse_linklist(head): p = head.next while p: yield p.data p = p.next head = create_linklist([1,2,3,4,5]) for val in traverse_linklist(head): print(val)
尾插法
class Node(object): def __init__(self,data=None): self.data = data self.next = None #遍历整个链表 def traverse_linklist(head): p = head.next while p: yield p.data p = p.next def create_linklist_tail(li): head = Node() tail = head for val in li: p = Node(val) #创建节点 tail.next = p #将当前的节点作为尾节点的下一个节点 tail = p #将当前的节点作为尾节点 return head head = create_linklist_tail([1,2,3,4,5]) for val in traverse_linklist(head): print(val)
1.3 单链表节点的插入和删除
1.3.1 插入
在当前指定的节点 curNode 后面插入一个节点 p
p.next = curNode.next #将当前节点的下一个节点作为节点p的下一个节点 curNode.next = p #将p作为当前节点的下一个节点
1.3.2 删除
p = curNode.next curNode.next = curNode.next.next del p #可以手动删除或者后续会自动回收
2. 双向链表
2.1 双链表的概述
双链表中每个节点有两个指针:一个指向后面节点、一个指向前面节点
节点的定义:
class DNode: def __init__(self,data = None): self.data = data self.next = None self.prior = None
2.2 双链表的建立和遍历
class DNode: def __init__(self,data = None): self.data = data self.next = None self.prior = None def create_linklist_tail(li): head = DNode() tail = head for val in li: p = DNode(val) tail.next = p p.prior = tail tail = p return head,tail def traverse_linklist(head): p = head.next while p: yield p.data p = p.next #往前遍历 def traverse_linklist_back(tail): p = tail while p.prior: yield p.data p = p.prior head, tail = create_linklist_tail([1,2,3,4,5]) for val in traverse_linklist_back(tail): print(val)
2.3 双链表节点的插入和删除
插入
p.next = curNode.next curNode.next.prior = p p.prior = curNode curNode.next = p
删除
p = curNode.next curNode.next = p.next p.next.prior = curNode del p