美文网首页
双向链表

双向链表

作者: zxhChex | 来源:发表于2019-09-26 08:42 被阅读0次

    双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

    双链表的示意图如下:

    231247423393589.jpg

    表头为空,表头的后继节点为"节点10"(数据为10的节点);"节点10"的后继节点是"节点20"(数据为10的节点),"节点20"的前继节点是"节点10";"节点20"的后继节点是"节点30","节点30"的前继节点是"节点20";...;末尾节点的后继节点是表头。

    双链表删除节点

    231248185524615.jpg

    删除"节点30" 删除之前:"节点20"的后继节点为"节点30","节点30" 的前继节点为"节点20"。"节点30"的后继节点为"节点40","节点40" 的前继节点为"节点30"。 删除之后:"节点20"的后继节点为"节点40","节点40" 的前继节点为"节点20"。

    双链表添加节点

    241342164043381.jpg

    在"节点10"与"节点20"之间添加"节点15" 添加之前:"节点10"的后继节点为"节点20","节点20" 的前继节点为"节点10"。 添加之后:"节点10"的后继节点为"节点15","节点15" 的前继节点为"节点10"。"节点15"的后继节点为"节点20","节点20" 的前继节点为"节点15"。

    #!/usr/bin/env python3
    # -*- encoding:utf-8 -*-
    """
    @author: jjcoder
    @file: DoubleLinkList.py
    @time: 9/5/1910:18 PM
    """
    import SingleLinkList  
    # 这里is_empty() travel() length() 可以直接继承单链表就可以了,
    #__init__直接重写就可以,这里提出来,不实现了!
    
    class Node(object):
        """双向链表的节点类"""
    
        def __init__(self, item):
            self.elem = item
            self.next = None  # 后继节点
            self.prev = None  # 前驱节点
    
    class DoubleLinkList(object):
        """双向链表"""
    
        def __init__(self, node=None):
            self.__head = node
    
        # is_empty()链表是否为空
        def is_empty(self):
            return self.__head is None
    
        # length()链表长度
        def length(self):
            cur = self.__head
            count = 0
            while cur is not None:
                count += 1
                cur = cur.next
            return count
    
        # travel()遍历链表
        def travel(self):
            cur = self.__head
            while cur is not None:
                print(cur.elem, end=' ')
                cur = cur.next
            print()
    
        # add(item)链表头部添加元素
        def add(self, item):
            node = Node(item)
            # node.next = self.__head  这是一种方式
            # self.__head = node
            # node.next.prev = node
            #######################################################
            node.next = self.__head
            self.__head.prev = node
            self.__head = node
    
        # append(item)链表尾部添加元素
        def append(self, item):
            node = Node(item)
            cur = self.__head
            if self.is_empty():
                self.__head = node
            else:
                while cur.next is not None:
                    cur = cur.next
                cur.next = node
                node.prev = cur
    
        # insert(pos, item)指定位置添加元素
        def insert(self, pos, item):
            node = Node(item)
            if pos < 0:
                self.add(item)
            elif pos > (self.length() - 1):
                self.append(item)
            else:
                cur = self.__head
                count = 0
                while count < pos:
                    count += 1
                    cur = cur.next  # 这里只使用一个游标,因为这是双向链表,所以,不需要再添加一个游标
                node.next = cur
                node.prev = cur.prev
                cur.prev.next = node  # 注意这两句的先后顺序不能变
                cur.prev = node
    
        # remove(item)删除节点
        def remove(self, item):
            cur = self.__head
            while cur is not None:
                if cur.elem == item:
                    if cur == self.__head:
                        self.__head = cur.next
                        if cur.next:
                            # 判断链表是否只有一个节点
                            cur.next.prev = None
                    else:
                        cur.prev.next = cur.next
                        if cur.next:
                            # 判断删除的节点在尾部
                            cur.next.prev = cur.prev
                    break
                else:
                    cur = cur.next
    
        # search(item)查找元素是否存在
        def search(self, item):
            cur = self.__head
            while cur is not None:
                if cur.elem == item:
                    return True
                else:
                    cur = cur.next
            return False
    
    if __name__ == "__main__":
        double = DoubleLinkList()
    

    相关文章

      网友评论

          本文标题:双向链表

          本文链接:https://www.haomeiwen.com/subject/dotyyctx.html