双端队列 [Python3]
双端队列 是 LintCode(详见 LintCode介绍)所提供的一道 简单 级别的面试题,现在我对Python3的实现做以简单分析,如有不妥之处,欢迎指正。
题目描述
实现一个双端队列
- push_front(item). 将新项添加到队列的前面。
- push_back(item). 将新项添加到队列的后面。
- pop_front(). 将第一个项移出队列,返回它。
- 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
解释
我们假想有一排座位:
当然按照题目来说,这排座位应当是无限长的,但我们演示就没必要那样苛刻了。
-
push_front(item) 是将 item 这个项在最前面给他安排一个座位,如果座位有人,那么把原本的人依次往后推,当然也可以理解成在最左边加个座位。
-
push_back(item) 则是在座位的最右边为 item 项安排一个座位。
-
pop_front() 就是把最左边的那个项连人带座位一块移除(哈哈哈哈感觉他好委屈)。
-
pop_back() 则是把最右边的那个项连人带座位一块移除。
比如样例1:
- push_front(1)
1 | |
---|---|
最开始没有座位(或者说全是空座),在最左边(好像没啥区别)加上了 “1”。
- push_back(2)
1 | 2 |
---|---|
在最右边加一个座位,把“2”加进去。
- pop_back()
1 | |
---|---|
诶嘿,“2”还没和“1”搭上话,直接给他连人带座位赶走了。
- pop_back()
因为在第 3 步操作后,整个队列就剩下了 “1”这一个项,所以不论从最左边还是从最右边移除,“1”都逃不掉。
- push_back(3)
3 | |
---|---|
- push_back(4)
3 | 4 |
---|---|
- pop_front()
4 | |
---|---|
- 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