跳至正文
View Categories

1 min read

313 双向链表实现双端队列2 #

  1. 双向链表结点的构造
  2. 双端队列的完整实现

双向链表结点的构造 #

双向链表除了当前值外,还存在前一个结点和后一个结点:

class Node:
    __slots__ = 'prev', 'next', 'val'
    def __init__(self, val):
        self.prev = self.next = None
        self.val = val

双端队列的完整实现 #

class Node:
    __slots__ = 'prev', 'next', 'val'

    def __init__(self, val):
        self.prev = self.next = None
        self.val = val


class CircularDeque:
    def __init__(self, k):
        self.head = self.tail = None
        self.capacity = k
        self.size = 0

    def insertFront(self, value):
        if self.isFull():
            return False
        node = Node(value)
        if self.isEmpty():
            self.head = node
            self.tail = node
        else:
            node.next = self.head
            self.head.prev = node
            self.head = node
        self.size += 1
        return True

    def insertLast(self, value):
        if self.isFull():
            return False
        node = Node(value)
        if self.isEmpty():
            self.head = node
            self.tail = node
        else:
            self.tail.next = node
            node.prev = self.tail
            self.tail = node
        self.size += 1
        return True

    def deleteFront(self):
        if self.isEmpty():
            return False
        self.head = self.head.next
        if self.head:
            self.head.prev = None
        self.size -= 1
        return True

    def deleteLast(self):
        if self.isEmpty():
            return False
        self.tail = self.tail.prev
        if self.tail:
            self.tail.next = None
        else:
            self.head=None
        self.size -= 1
        return True

    def getFront(self):
        return -1 if self.isEmpty() else self.head.val

    def getRear(self):
        return -1 if self.isEmpty() else self.tail.val

    def isEmpty(self):
        return self.size == 0

    def isFull(self):
        return self.size == self.capacity

    def printDeque(self):
        temp = self.head
        if(temp == None):
            print("空队列")
            return
        while(temp != None):
            print(temp.val)
            temp = temp.next


queue = CircularDeque(3)
print("头结点插入1,结果为:")
queue.insertFront(1)
queue.printDeque()
print("尾结点插入2, 结果为:")
queue.insertLast(2)
queue.printDeque()
print("头结点删除1,结果为:")
queue.deleteFront()
queue.printDeque()
print("尾结点删除2, 结果为:")
queue.deleteLast()
queue.printDeque()
print("最后结果")
queue.printDeque()

小结 #

  • 掌握双端队列增加、删除结点的方法
  • 掌握双端队列类的写法
  • 习题 #

    1. 删除尾结点方法为何在self.tail为空时需要将self.head也置空?
    2. 尝试自己实现一遍双端队列