Leetcode刷题之是否为平衡树(面向对象思想)、链表有环

每个技术人员都应该有自己的技术博客,用来记录学习笔记我的笔记,如果有问题希望大家能够指点。
之前的一篇判断平衡树的文章

题目描述:
给定一颗二叉树,判断该树是否为平衡二叉树。
平衡二叉树的定义是,树中每个节点的左右子树高度差不能超过1
题目链接
题目分析:
对于之前的文章中,求出每个节点的高度并进行一一判断,递归进行每个节点的高度计算并判断,其中会进行两次的高度计算过程;本次使用的是将计算的中间结果进行封装并且将判断结果也进行记录,每个节点向上级节点提供自己的高度和自己是否平衡。
这样主要是为了体现面向对象的这个思想。
代码如下:

class Solution {
    public boolean isBalanced(TreeNode root) {
       Message  msg = getHigh(root);
       return msg.isbalance;
    }
    public Message getHigh(TreeNode root){
    	//空节点传递的是高度为0,并且一定是平衡的
        if(root==null)return new Message(0,true);
        //默认左边节点返回消息,默认右边返回消息
        Message mleft = getHigh(root.left);
        Message mright = getHigh(root.right);
        //进行判断与计算高度
        int high = mleft.high >mright.high?mleft.high+1:mright.high+1;
        int cha = Math.abs(mleft.high-mright.high);
        //消息封装
        if(mleft.isbalance&&mright.isbalance&&cha <= 1){
            return new Message(high,true);
        }
        return new Message(high,false);
    }
}
//创建自定义的消息封装体,利用构造函数传递消息值
class Message{
    public int high;
    public boolean  isbalance;
    public Message(int high,boolean isbalance){
        this.high = high;
        this.isbalance = isbalance;
    }
}

题目描述:
环形链表,给定一个链表,判断链表中是否有环,如果有环返回true,如果没有环返回false
题目链接
题目分析:
对于链表来说,链表有指向下一个节点的指针区域,这样就可以不用使用连续的存储空间并且不用预先指定存储空间的大小。
链表有环问题一般会使用快慢指针,快指针每次走两步,慢指针每次向前走一步,如果没有环则快指针会指向空值,如果有环快指针一定会与慢指针指向同一个节点。
代码如下:

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        //只有一个节点和空节点一定不会成环
        if(fast==null||fast.next==null)return false;
        while(fast!=null&&fast.next!=null){
             fast = fast.next.next;
            slow = slow.next;
            //快指针与慢指针相重合,即有环
            if(fast == slow)return true;
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值