剑指 Offer 09. 用两个栈实现队列
方法一:
class CQueue {
Stack<Integer> stack1=new Stack<>();
Stack<Integer> stack2=new Stack<>();
public CQueue() {
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
int res=0;
if(stack1.isEmpty()){
return -1;
}else{
while(stack1.size()!=1){
stack2.push(stack1.pop());
}
res= stack1.pop();
while(stack2.size()!=0){
stack1.push(stack2.pop());
}
}
return res;
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
方法二:
class CQueue {
//Stack<Integer> stack1=new Stack<>();
// Stack<Integer> stack2=new Stack<>();
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
stack1=new Stack<>();
stack2=new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
int res=0;
if(stack1.isEmpty()&&stack2.isEmpty()){
return -1;
}else{
//改进方法:将第一个栈中数据加到第二个栈中去,这样第二个栈正常弹出元素即为队列顺序
if(stack2.isEmpty()){
while(stack1.size()!=0){
stack2.push(stack1.pop());
}
}
res= stack2.pop();
}
return res;
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
剑指 Offer 06. 从尾到头打印链表
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] reversePrint(ListNode head) {
ListNode cur=head;
int count=0;
while(cur!=null){
count++;
cur=cur.next;
}
int[] res=new int[count];
for(int i=count-1;i>=0;i--){
res[i]=head.val;
head=head.next;
}
return res;
}
}
剑指 Offer 24. 反转链表
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode cur=null;
while(head!=null){
cur=head.next;
head.next=pre;
pre=head;
head=cur;
}
return pre;
}
}