1. 从尾到头打印链表
从尾到头反过来打印出每个结点的值。
解题思路
1)使用递归
要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> ret = new ArrayList<>();
if (listNode != null) {
ret.addAll(printListFromTailToHead(listNode.next));
ret.add(listNode.val);
}
return ret;
}
2)使用栈
栈具有后进先出的特点,在遍历链表时将值按顺序放入栈中,最后出栈的顺序即为逆序。
剑指offer代码:
- import java.util.ArrayList;
- import java.util.Stack;
- /**
- * public class ListNode {
- * int val;
- * ListNode next = null;
- *
- * ListNode(int val) {
- * this.val = val;
- * }
- * }
- *
- */
- import java.util.ArrayList;
- public class Solution {
- public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
- ArrayList<Integer> list = new ArrayList<Integer> ();
- Stack<Integer> stack = new Stack<Integer>();
- while(listNode!=null)
- {
- stack.push(listNode.val);
- listNode = listNode.next;
- }
- while(!stack.isEmpty())
- list.add(stack.pop());
- return list;
- }
- }
本机跑的代码:
- /**
- * @param ycy
- */
- public ArrayList<Integer> printListRever(ListNode listnode){ //使用栈完成倒叙
- Stack stack = new Stack<Integer>();
- while(listnode != null){
- stack.add(listnode.val);
- listnode = listnode.next;
- }
- ArrayList<Integer> ret = new ArrayList<Integer>();
- while(!stack.isEmpty()){
- ret.add((Integer) stack.pop());
- }
- return ret;
- }
- class ListNode //定义ListNode类
- {
- int val;
- ListNode next;
- public ListNode(int x){
- val=x;
- }
- }
- public ListNode addTwoNumbers(ListNode l1,ListNode l2){ //对ListNode进行添加操作
- ListNode dummyHead = new ListNode(0);
- ListNode p=l1,q=l2,curr=dummyHead;
- int carry=0;//进位
- while(p!=null || q!=null){
- int x=(p!=null)?p.val:0;
- int y=(q!=null)?q.val:0;
- int sum=x+y+carry;
- carry=sum/10;
- curr.next=new ListNode(sum%10);
- curr=curr.next;
- if(p!=null) p=p.next;
- if(q!=null) q=q.next;
- }
- if(carry>0){
- curr.next=new ListNode(carry);
- }
- return dummyHead.next;
- }
2 、数组的基本操作
- public class myArray {
- /**
- * @param ycy
- */
- private int[] arry;
- private int elements=0;
- public myArray(){
- arry = new int[50];
- }
- public myArray(int maxsize){
- arry = new int[maxsize];
- }
- public void insert(int value){ //添加数据
- arry[elements] = value;
- elements++;
- }
- public void Orderinsert(int value){ //有序添加数据 初始化有序数组
- int i;
- for(i=0;i<elements;i++){
- if(arry[i]>value){
- break;
- }
- }
- for(int j=elements;j>i;j--){ //有序插入的时候,每次进行后移,当判断数据大于value的时候,则把数据插入到当前元素前面,当前元素之后的数据进行后移
- arry[j] = arry[j-1];
- }
- arry[i] = value;
- elements++;
- }
- public void display(){
- System.out.print("{");
- for(int i=0;i<elements;i++){
- System.out.print(arry[i] + " ");
- }
- System.out.print("}");
- }
- public int search(int index){ //查找索引所对应的数据index >= elements || index < 0,不用落下等于号
- if(index >= elements || index < 0){
- return -1;
- }else{
- System.out.println(arry[index]);
- return arry[index];
- }
- }
- public int searchIndex(int value){ //查找下标
- for(int i=0;i<arry.length;i++){
- if(arry[i]==value){
- return i;
- }
- }
- return -1;
- }
- public void delete(int index){ //删除数据
- if(index >= elements || index < 0){
- throw new ArrayIndexOutOfBoundsException();
- }else{
- for(int i=index;i<elements;i++){ //删除数组中的一个数据,就是这个数据后面的数据进行前移
- arry[i] = arry[i+1];
- }
- elements--;
- }
- }
- public void change(int index,int value){
- arry[index] = value;
- }
- public int Binarysearch(int value){ //二分查找,针对有序的数组
- int middle =0, low = 0, high = 0;
- while(true){
- middle = (low + high) / 2;
- if(value == middle){
- return middle;
- }else{
- if(arry[middle] > value){
- high = middle-1;
- for(int i=low;i<high;i++){
- if(arry[i] == value){
- return i;
- }
- }
- }else{
- low = middle+1;
- for(int i=low;i<elements;i++){
- if(arry[i] == value){
- return i;
- }
- }
- }
- }
- return -1;
- }
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- myArray mya = new myArray();
- mya.Orderinsert(12);
- mya.Orderinsert(45);
- mya.Orderinsert(432);
- mya.Orderinsert(42);
- mya.display();
- System.out.println("索引是"+mya.searchIndex(42));
- System.out.println("索引4的值是"+mya.search(4));
- // mya.delete(1);
- // mya.display();
- // mya.change(0, 4);
- // mya.display();
- System.out.print(mya.Binarysearch(432));
- }
- }
3、二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路
1)中序遍历:先左后根后右边
2)其中下一个节点包括:如果包含右子树,则是右子树的最左边节点,否则是向上链接节点的祖先节点
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
- class TreeLinkNode {
- int val;
- TreeLinkNode left = null;
- TreeLinkNode right = null;
- TreeLinkNode next = null;
- TreeLinkNode(int val) {
- this.val = val;
- }
- }
- public TreeLinkNode getNext(TreeLinkNode tlnode){
- if(tlnode.right != null){ //如果一个节点的右子树不为空,那么该节点的下一个节点就是右子树的最左节点
- TreeLinkNode node = tlnode.right;
- while(node.left != null){
- node = node.left;
- }
- return node;
- }else{ //否则,向上找第一个左链接指向的树所包含的祖先节点
- while(tlnode.next != null){
- TreeLinkNode parent = tlnode.next;
- if(parent.left == tlnode)
- return parent;
- tlnode = tlnode.next;
- }
- }
- return null;
- }
4 、用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。
解题思路
1 )栈先进后出,队列是先进先出
2)用两个栈实现队列,其实就是完成先进先出操作,也就是,一个栈作为输入栈,使得数据“先进后出”,另一个栈作为输出栈,将输入站的数据输入到输出栈中,实现原来数据顺序的逆序进入,然后再输出即可
3)栈1,输入----》输出到栈2------》栈2输出,即可实现先进先出。注意判断是否为空栈
剑指offer代码:
- import java.util.Stack;
- public class Solution {
- Stack<Integer> stack1 = new Stack<Integer>();
- Stack<Integer> stack2 = new Stack<Integer>();
- public void push(int node){
- while(!stack2.isEmpty()){
- stack1.push(stack2.pop());
- }
- stack2.push(node);
- }
- public int pop(){
- while(!stack1.isEmpty()){
- stack2.push(stack1.pop());
- }
- return stack2.pop();
- }
- }
本地代码:
- public class testStackArray {
- /**
- * @param ycy
- */
- Stack<Integer> stackIn = new Stack<Integer>();
- Stack<Integer> stackOut = new Stack<Integer>();
- public void push(int node){
- stackIn.push(node);
- }
- public int pop(int node){
- if(stackOut.isEmpty()){
- while(!stackIn.isEmpty()){
- stackOut.push(stackIn.pop());
- }
- }
- if(stackOut.isEmpty()){
- return -111111;
- }
- return stackOut.pop();
- }
- }
扫码关注一起随时随地学习!!!就在洋葱攻城狮,更多精彩,等你来!!