python数据结构学习笔记-2016-11-07-01-双链表

        9.1 双链表

        双链表(doubly link list):与之前的单链表不同的是,每一个结点有两个指针,一个指向下一个结点,另外一个指向上一个结点。

        双链表中有两个指针,分别为头指针和尾指针,分别指向第一个结点和最后一个结点。

        

        双链表的操作

        遍历

        双链表可以允许向前遍历,也可以向后遍历。

# 遍历,可从前往后遍历,也可从后往前遍历,时间复杂度是O(n)
def Traversal(head):
    curNode = head
    while curNode is not None:
        print curNode.data
        curNode = curNode.next

def revTraversal(tail):
    curNode = tail
    while curNode is not None:
        print curNode.data
        curNode = curNode.prev

       搜索

       假定链表有序,可以选择任意一个结点作为起点,如果目标值小于起始结点值,则向前遍历搜索,如果目标值大于起始结点值,则向后遍历搜索。

# 搜索,假设链表有序,可任意选择一个结点作为起始点,根据大小,选择遍历方向
def search(head, tail, probe = None):
    if head is None:
        return False
    elif probe is None:
        probe = head
    if target < probe.data: # 目标比probe小,向前遍历
        while probe is not None and target <= probe.data:
            if target == probe.data:
                return True
            else:
                probe = probe.prev
    else: # 目标比probe大,向后遍历
        while probe is not None and target >= probe.data:
            if target == probe.data:
                return True
            else:
                probe = probe.next
    return False

       插入

       向有序双链表中插入元素,与单链表情况类似,只是要处理prev指针的指向。分三种情况,在第一个结点前插入,在最后一个结点后插入以及在中间插入。

# 插入元素
def insert(head, tail, value):
    newnode = DListNode(value)
    if head is None: # 双链表为空
        head = newnode
        tail = head
    elif value < head.data: # 在head前插入元素
        newnode.next = head
        head.prev = newnode
        head = newnode
    elif value > tail.data: # 在tail后插入元素
        newnode.prev = tail
        tail.next = newnode
        tail = newnode
    else: # 在中间插入
        node = head
        while node is not None and node.data < value:
            node = node.next
        newnode.next = node
        newnode.prev = node.prev
        node.prev.next = newnode
        node.prev = newnode

       删除

       删除元素也与单链表情形类似,也是要注意处理prev指针的指向。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值