题目地址:
https://www.lintcode.com/problem/implement-queue-by-linked-list-ii/description
用链表实现双端队列。要求实现从队头队尾加入和删除元素的功能。代码如下:
public class Dequeue {
class ListNode {
int val;
ListNode prev, next;
ListNode(int val) {
this.val = val;
}
}
private ListNode head, tail;
private int size;
public Dequeue() {
// do intialization if necessary
// 开两个dummy node
head = new ListNode(0);
tail = new ListNode(0);
head.next = tail;
tail.prev = head;
}
/*
* @param item: An integer
* @return: nothing
*/
public void push_front(int item) {
// write your code here
// 先new出新节点,让其接到head和head.next中间
ListNode node = new ListNode(item);
node.next = head.next;
node.prev = head;
// 修改剩余的指针
node.next.prev = node;
head.next = node;
size++;
}
/*
* @param item: An integer
* @return: nothing
*/
public void push_back(int item) {
// write your code here
// 先new出新节点,让其接到tail和tail.prev中间
ListNode node = new ListNode(item);
node.prev = tail.prev;
node.next = tail;
// 修改剩余的指针
node.prev.next = node;
tail.prev = node;
size++;
}
/*
* @return: An integer
*/
public int pop_front() {
// write your code here
int res = head.next.val;
head = head.next;
head.prev = null;
size--;
return res;
}
/*
* @return: An integer
*/
public int pop_back() {
// write your code here
int res = tail.prev.val;
tail = tail.prev;
tail.next = null;
size--;
return res;
}
}
所有方法时空复杂度 O ( 1 ) O(1) O(1)。