算法(四)

顺时针旋转矩阵

[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]
for i 0->n-1(代表列)
for j n-1->0(代表行)
a[i][n-j-1]=mat[j][i];

public int[][] rotateMatrix(int[][] mat, int n) {
        // write code here
        int[][] a=new int[n][n];
        for(int i=0;i<n;i++)
            {
            for(int j=n-1;j>=0;j--)
                {
                a[i][n-j-1]=mat[j][i];
            }
        }
        return a;
    }

判断链表是否回文

//使用快慢指针来寻找链表中间的节点
public class PalindromeList {
    public boolean chkPalindrome(ListNode A){
        ListNode fast=A;
        ListNode slow=A;
        ListNode nextHead=null;
        if(A==null||A.next==null)
        {
            return true;
        }
        //注意,如果只使用fast.next.next!=null作为判断条件会报空指针的问题。加入fast走到最后,fast.next为空。fast.next.next会报错。但是加上判断fast.next!=null即可因为&&的短路,第二个判断条件不会执行
        while (fast.next!=null&&fast.next.next!=null)
        {
            fast=fast.next.next;
            slow=slow.next;
        }
        nextHead=reverseList(slow.next);
        while (nextHead!=null)
        {
            if(A.val==nextHead.val){
                nextHead=nextHead.next;
                A=A.next;
            }else {
                return false;
            }
        }
        return true;

    }
    //使用两个指针来进行链表的翻转
    public ListNode reverseList(ListNode head)
    {
        if(head==null||head.next==null)
        {
            return head;
        }
        ListNode tail=null;
        while (head!=null)
        {
            ListNode next=head.next;
            head.next=tail;
            tail=head;
            head=next;
        }
        //最后tail是新链表的头指针
        return tail;

    }
}
点赞