力扣里面没找到这道题,我们用剑指 Offer 09. 用两个栈实现队列写一下代码。
分析:
1、基础:链表插入删除,这是基本操作;
2、head指针:为了方便删除第一个数据,维护一个head;
3、一个指向end的指针:尾部插入,每次都找到尾部那不是很麻烦;
4、维护指向end的指针:删除的过程中,end可能被删除掉,要让end再指向head。
代码:
class CQueue {
// 我们用的链表结构
struct ListNode{
int val;
ListNode* next;
ListNode(int _val):val(_val),next(NULL){}
};
public:
CQueue() {
// 清空数据
while(head->next){
ListNode* tmp = head->next;
head->next = tmp->next;
delete(tmp);
}
end = head;
}
void appendTail(int value) {
// 用end插入数据
ListNode* node = new ListNode(value);
end->next = node;
end = end->next;
}
int deleteHead() {
// 删除第一个节点,别忘了维护end
if(head->next){
ListNode* tmp = head->next;
int val = tmp->val;
head->next = tmp->next;
delete(tmp);
if(!head->next){
end = head;
}
return val;
}
return -1;
}
private:
// 两个节点,用一个head,方便头部删除
ListNode* head = new ListNode(-1);
ListNode* end = head;
};