双端队列 [Python3]

双端队列 [Python3]

双端队列 是 LintCode(详见 LintCode介绍)所提供的一道 简单 级别的面试题,现在我对Python3的实现做以简单分析,如有不妥之处,欢迎指正。

题目描述

实现一个双端队列

  1. push_front(item). 将新项添加到队列的前面。
  2. push_back(item). 将新项添加到队列的后面。
  3. pop_front(). 将第一个项移出队列,返回它。
  4. pop_back(). 将最后一项移出队列,返回它。

样例

例1:

输入:
push_front(1)
push_back(2)
pop_back() // return 2
pop_back() // return 1
push_back(3)
push_back(4)
pop_front() // return 3
pop_front() // return 4

例2:

输入:
push_front(1)
pop_front()// return 1

解释

我们假想有一排座位:

当然按照题目来说,这排座位应当是无限长的,但我们演示就没必要那样苛刻了。

  1. push_front(item) 是将 item 这个项在最前面给他安排一个座位,如果座位有人,那么把原本的人依次往后推,当然也可以理解成在最左边加个座位。

  2. push_back(item) 则是在座位的最右边为 item 项安排一个座位。

  3. pop_front() 就是把最左边的那个项连人带座位一块移除(哈哈哈哈感觉他好委屈)。

  4. pop_back() 则是把最右边的那个项连人带座位一块移除。

比如样例1:

  1. push_front(1)
1

最开始没有座位(或者说全是空座),在最左边(好像没啥区别)加上了 “1”。

  1. push_back(2)
1 2

在最右边加一个座位,把“2”加进去。

  1. pop_back()
1

诶嘿,“2”还没和“1”搭上话,直接给他连人带座位赶走了。

  1. pop_back()

因为在第 3 步操作后,整个队列就剩下了 “1”这一个项,所以不论从最左边还是从最右边移除,“1”都逃不掉。

  1. push_back(3)
3
  1. push_back(4)
3 4
  1. pop_front()
4
  1. pop_front()

当然还有,根据题目要求,每一步删除操作(pop)的时候,我们需要返回删除掉的值。

代码实现

class Dequeue:
    def __init__(self):
        self.dummy = self.tail = ListNode(-1)

    def push_front(self, item):
        newHead = ListNode(item)
        if self.dummy is self.tail: self.tail = newHead
        oldHead = self.dummy.next
        self.dummy.next = newHead
        newHead.next = oldHead

    def push_back(self, item):
        self.tail.next = ListNode(item)
        self.tail = self.tail.next

    def pop_front(self):
        if self.dummy is self.tail: return -1
        elif self.dummy.next is self.tail:
          res = self.tail.val
          self.tail = self.dummy
        else:
          res = self.dummy.next.val
          self.dummy.next = self.dummy.next.next
        return res

    def pop_back(self):
        if self.dummy is self.tail: return -1
        elif self.dummy.next is self.tail:
          res = self.tail.val
          self.tail = self.dummy
        else:
          head = self.dummy
          while head.next is not self.tail:
              head = head.next
          head.next = None
          res = self.tail.val
          self.tail = head
        return res

需说明部分

ListNode 是 LintCode (还有 LeetCode)中给出的链表定义:

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

感谢浏览 关注我每天刷题学Python3!

你可能感兴趣的:(队列,python,算法)