剑指offer面试题 java解答16-20

面试题16:反转链表

public class Test16 {
    private class Node<T>{
        private T obj;      
        private Node<T> next = null;
        Node(T obj) {
            this.obj = obj;
        }
    }
    private Node first = null;
    public Node getHeadNode(){
        return first;
    }
    public <T> void insertFirst(T obj){  
        Node node = new Node(obj);  
        node.next = first;  
        first = node;  
    }
    public Node ReverseList(Node head)
    {
        if (head==null) 
        {
            return null; 
        }
        Node reverseHead=null;
        Node preNode=null;
        Node nowNode=head;
        Node nextNode;
        while (nowNode!=null) 
        {
            if (nowNode.next==null)
            {
                reverseHead=nowNode;
            }
            nextNode=nowNode.next;
            nowNode.next=preNode;
            preNode=nowNode;
            nowNode=nextNode;
        }
        return reverseHead;
    }
    public static void main(String[] args) {
        int[] a={6,5,4,3,2,1};
        Test16 t=new Test16();
        for (int i = 0; i < a.length; i++) 
        {
            t.insertFirst(a[i]);//头插法
        }
        //链表为1->2->3->4->5->6
        Node head=t.ReverseList(t.getHeadNode());
    }
}

面试题17:合并两个排序的链表

public class Test17 {
    private class Node<T>{
        private T obj;      
        private Node<T> next = null;
        Node(T obj) {
            this.obj = obj;
        }
    }
    private Node firstOne = null;
    private Node firstTwo = null;
    public Node getHeadOne(){
        return firstOne;
    }
    public Node getHeadTwo(){
        return firstTwo;
    }
    public <T> void insertFirstOne(T obj){  
        Node node = new Node(obj);  
        node.next = firstOne;  
        firstOne = node;  
    }
    public <T> void insertFirstTwo(T obj){  
        Node node = new Node(obj);  
        node.next = firstTwo;  
        firstTwo = node;  
    }
    public  void showLinkList(Node head) throws Exception{
        if (head==null) {
            throw new Exception("null");
        }
        Node cur=head;
        while (cur!=null) 
        {
            System.out.println("\n"+cur.obj);
            cur=cur.next;
        }
    }
    public <T extends Comparable<? super T>> Node<T> Merge(Node<T> headOne,Node<T> headTwo){
        if (headOne==null) 
        {
            return headTwo;
        }
        if (headTwo==null)
        {   
            return headOne;
        }
        Node<T> mergeHead=null;
        if ((headOne.obj).compareTo(headTwo.obj)<0) 
        {
            mergeHead=headOne;
            mergeHead.next=Merge(headOne.next, headTwo);
        }else 
        {
            mergeHead=headTwo;
            mergeHead.next=Merge(headOne, headTwo.next);
        }
        return mergeHead;
    }
    public static void main(String[] args) throws Exception {
        int[] a={7,5,3,1};
        int[] b={8,6,4,2};
        Test17 t=new Test17();
        for (int i = 0; i < a.length; i++) 
        {
            t.insertFirstOne(a[i]);//头插法
        }
        //链表为1->3->5->7
        for (int i = 0; i < a.length; i++) 
        {
            t.insertFirstTwo(b[i]);//头插法
        }
        //链表为2->4->6->8
        Node mergeHead=t.Merge(t.getHeadOne(), t.getHeadTwo());
        t.showLinkList(mergeHead);
    }
}

面试题18:树的子结构

public class Test18<T> {
    private class Node<T> {
        public T value;
        public Node<T> lChild;
        public Node<T> rChild;
        public Node(T value) {
            this.value = value;
        }
    }
    public Node<T> treeOne;
    public Node<T> treeTwo;
    private int pos = 0;
    public Node<T> creatBiTreeOne(T[] value){
        pos=0;
        return treeOne=creatBiTree(treeOne, value);
    }
    public Node<T> creatBiTreeTwo(T[] value){
        pos=0;
        return treeTwo=creatBiTree(treeTwo, value);
    }
    // 以node为根节点,创建一棵树,返回此根节点
    private Node<T> creatBiTree(Node node, T[] value) {
        T t = value[pos];
        pos++;
        if (t == null) {
            return null;
        } else {
            node = new Node<T>(t);
            node.lChild = creatBiTree(node.lChild, value);
            node.rChild = creatBiTree(node.rChild, value);
        }
        return node;
    }
    public void preOrderTraverse(Node node) {
        if (node != null) {
            System.out.println("" + node.value);
            preOrderTraverse(node.lChild);
            preOrderTraverse(node.rChild);
        }
    }
    private <T extends Comparable<? super T>> boolean dosHaveSubtree(Node<T> tree1,Node<T> tree2){
        if (tree2==null) 
        {
            return true;
        }
        if (tree1==null) 
        {
            return false;
        }
        if (tree1.value.compareTo(tree2.value)!=0)
        {
            return false;
        }
        return dosHaveSubtree(tree1.lChild, tree2.lChild)&&dosHaveSubtree(tree1.rChild, tree2.rChild);
    }
    public <T extends Comparable<? super T>> boolean HasSubtree(Node<T> tree1,Node<T> tree2){
        boolean hasSubtree=false;
        if (tree1!=null&&tree2!=null) 
        {
            if (tree1.value.compareTo(tree2.value)==0)
            {
                hasSubtree=dosHaveSubtree(tree1,tree2);
            }
            if (!hasSubtree) 
            {
                hasSubtree=HasSubtree(tree1.lChild, tree2);
            }
            if (!hasSubtree) 
            {
                hasSubtree=HasSubtree(tree1.rChild, tree2);
            }
        }
        return hasSubtree;
    }
    public static void main(String[] args) {
        Object[] a = { 8, 8, 9, null, null, 2, 4, null, null, 7, null, null, 7,null, null };
        Object[] b = { 8, 9, null, null, 2, null, null};
        Test18 t = new Test18();
        t.creatBiTreeOne(a);
        t.creatBiTreeTwo(b);
        System.out.println(t.HasSubtree(t.treeOne, t.treeTwo));
    }
}

面试题19:二叉树的镜像

public class Test19<T>{
    private class Node<T> {
        public T value;
        public Node<T> lChild;
        public Node<T> rChild;
        public Node(T value) {
            this.value = value;
        }
    }
    public Node<T> root=null;
    private int pos = 0;
    public void creatBiTree(T[] value){
        pos=0;
        root=creatBiTree(root, value);
    }
    // 以node为根节点,创建一棵树,返回此根节点
    private Node<T> creatBiTree(Node node, T[] value) {
        T t = value[pos];
        pos++;
        if (t == null) {
            return null;
        } else {
            node = new Node<T>(t);
            node.lChild = creatBiTree(node.lChild, value);
            node.rChild = creatBiTree(node.rChild, value);
        }
        return node;
    }
    public void preOrderTraverse(Node node) {
        if (node != null) {
            System.out.println("" + node.value);
            preOrderTraverse(node.lChild);
            preOrderTraverse(node.rChild);
        }
    }
    public void MirrorRecursively(Node<T> root) {
        if (root!=null) 
        {
            Node<T> rNode=root.rChild;
            root.rChild=root.lChild;
            root.lChild=rNode;
            MirrorRecursively(root.lChild);
            MirrorRecursively(root.rChild);
        }       
    }
    public static void main(String[] args) {
        Object[] a = { 8, 6, 5, null, null, 7, null, null, 10, 9, null, null, 11, null, null };
        Test19 t = new Test19();
        t.creatBiTree(a);
        t.MirrorRecursively(t.root);
        t.preOrderTraverse(t.root);
    }
}

面试题20:顺时针打印矩阵

public class Test20 {
    public void PrintMatrixClockwisely(int[][] a){
        if (a==null)
        {
            return;
        }
        int rows=a.length;
        int columns=a[0].length;
        int start=0;
        while (rows>start*2&&columns>start*2) {
            PrintMatrixInCircle(a,rows,columns,start);
            start++;
        }
    }
    private void PrintMatrixInCircle(int[][] a, int rows, int columns, int start) {
        int endX=columns-start-1;
        int endY=rows-start-1;
        for (int i = start; i <=endX; i++)
        {
            int number=a[start][i];
            printNumber(number);
        }
        if (start<endY) 
        {
            for (int i = start+1; i <=endY; i++) 
            {
                int number=a[i][endX];
                printNumber(number);
            }
        }
        if (start<endX&&start<endY) 
        {
            for (int i = endX-1; i >=start; i--) {
                int number=a[endY][i];
                printNumber(number);
            }
        }
        if (start<endX&&start<endY-1) 
        {
            for (int i = endY-1; i >=start+1; i--)
            {
                int number=a[i][start];
                printNumber(number);
            }
        }

    }
    private void printNumber(int number) {
        System.out.print(number+",");
    }
    public static void main(String[] args) {
        int[][] a={
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16}
        };
        Test20 t=new Test20();
        t.PrintMatrixClockwisely(a);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值