数据结构 - 链表

链表

  • 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

 

posted @ 2019-04-10 20:32  一路向北_听风  阅读(149)  评论(0)    收藏  举报