算法-双向链

# @ Time : 2020/11/2 11:52
# @ Author : Ellen

'''
.is_empty()链表是否 为空
.length() 链表长度
.travel() 遍历整个链表
.append(item) 链表尾部添加元素
.add(item) 链表头部添加元素
.insert(pos, item) 指定位置添加元素
.search(item) 查找节点是否存在
.remove(item) 删除节点
'''


class Node(object):
    """双向链表的节点"""

    def __init__(self, item):
        # item存放数据
        self.item = item
        # next是下一个节点的标识
        self.next = None
        # prev是上一个节点的标识
        self.prev = None


class DoubleLinkList(object):
    """双向链表"""

    def __init__(self, node=None):
        self.__head = node

    # 判断链表是否为空
    def is_empty(self):
        if self.__head == None:
            return True
        else:
            return False

    # 链表长度
    def length(self):
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    # 遍历整个链表
    def travel(self):
        cur = self.__head
        while cur != None:
            print(cur.item, end=' ')
            cur = cur.next

    # 双向链表头部添加元素
    def add(self, item):
        node = Node(item)
        if self.is_empty():
            # 空链表
            self.__head = node
        else:
            # 将node的next指向__head
            node.next = self.__head
            # 将__head指向的头结点的prev指向node
            self.__head.prev = node
            # 将__head指向node
            self.__head = node

    # 双向链表的尾部添加
    def append(self, item):
        node = Node(item)
        # 空链表
        if self.is_empty():
            self.__head = node
        else:
            # 非空链表
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            # 循环结束 cur指向最后一个节点
            cur.next = node
            node.prev = cur

    def insert(self, pos, item):
        """指定位置添加元素"""
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            node = Node(item)
            cur = self.__head
            count = 0
            while count < (pos-1):
                count += 1
                cur = cur.next

            node.prev = cur
            node.next = cur.next
            cur.next.prev = node
            cur.next = node


if __name__ == '__main__':
    dll = DoubleLinkList()
    dll.add(20)
    dll.add(30)
    dll.insert(1, 66)
    dll.insert(2, 77)
    dll.travel()

执行结果:
30 66 77 20

猜你喜欢

转载自blog.csdn.net/weixin_45905671/article/details/109481278