简单数构

1 篇文章 0 订阅
0 篇文章 0 订阅

链表:链表与数组有一定的相似性,但是也有一定的区别。数组在查找遍历方面快速简单,数组是通过下表索引查找;而链表在插入删除方面方便简单。数组在插入方面要移动一大堆的数据,而链表确实修改索引就可以轻松达到

获取链表的长度算法

public int getSize() {
		
		int num = 0;
		if(head==null){//空列表
			
		}else{ //非空列表
			num++;//加上头结点
			Node node=head.getNaxt(); //获取头结点后的节点
			while(node!=null){//节点非空
				num++;//节点数累加
				node=node.getNaxt();//节点指针后移
			}
		}
		return num;
	}

 添加节点的方法:要判断是否为头结点

	@Override
	/**
	 * 添加数据节点到链表的末尾
	 */
	public void add(String date) {
		Node node =new Node(date,null);
		if(getSize()==0){//空自定义列表
			head=node;
		}else{
			Node node1=get(getSize()-1);
			node1.setNaxt(node);
		}

	}
	/**
	 * 添加元素到指定索引位置
	 */
	@Override
	public void add(int index, String date) {
		Node node =new Node(date,null);
		if(index<0||index>getSize()){//越界
			try {
				throw new Exception("越界");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else if(index==0){//空列表时候插入的节点为头结点
			node.setNaxt(head);
			head=node;
		}else{//插入节点到指定的索引出
			Node node1=get(index-1);
			Node node2=get(index);
			node.setNaxt(node2);
			node1.setNaxt(node);
		}
		
	}

 删除节点方法,要判断要删除的节点是否在链表当中

	/**
	 * 删除指定的数据元素节点
	 */
	@Override
	public void del(String date) {
		int i=fint(date);
		if(i!=-1){//要删除的数据节点在列表当中
			get(i-1).setNaxt(get(i+1));//删除节点
		}
		
	}
	/**
	 * 删除指定索引的节点
	 */
	@Override
	public void del(int intdex) {
		if(intdex<0||intdex>getSize()){//索引越界
			try {
				throw new Exception("越界");
			} catch (Exception e) {
				e.printStackTrace();
				return;
			}
		}
		//删除节点
		Node node1=get(intdex-1);
		Node node2=get(intdex+1);
		node1.setNaxt(node2);
	}

 查找节点方法:要判断链表是否为空,节点是否是在链表当中

/**
	 * 查找指定索引的节点
	 */
	public String fint(int intdex) {
	
		return get(intdex).getData();//放回指定索引的节点的数据
	}
	/**
	 * 查找指定数据元素的节点
	 */
	public int fint(String deta) {
		int num=0;
		Node node=head;
		if(node.getData().equals(deta)){//头结点的数据等于要查找的元素
			return num;//放回节点数
		}
		while(!node.getData().equals(deta)&&node.getNaxt()!=null){//节点后移查找元素
			num++;
			node=node.getNaxt();
		}
		
		if(num==getSize()&&!node.getData().equals(deta)){//查找的元素不在列表中
			try {
				throw new Exception("不存在该数据的节点");
			} catch (Exception e) {
				e.printStackTrace();
			}
			return -1;
		}
		else 
			return num;
	}

 获取某节点的方法属于链表操作的核心位置是其他方法的基础,不仅要判断连表是否为空是否存在,索引是否越界

/**
	 * 获取指定的索引的节点
	 */
	public Node get(int intdex){//
		if(intdex<0){//列表为空
			 try {
				throw new Exception("无该节点");
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}
		}
		int count = 0;
		// 如果index为0的情况,则直接返回头节点
		if (count == intdex) {//查找到元素
			return head;
		}
		// 判断索引是不是已经越界
		if (intdex < getSize()) {
			// 如果没有越界的情况,获取头节点的下一个节点
			Node node = head.getNaxt();
			while (node != null) {
				count++;
				if (count == intdex) {
					return node;
				}
				node = node.getNaxt();
			}
		} else {
			// 如果索引位置为负数,打印异常栈
			try {
				throw new Exception("索引越界");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

 

 

 

 

二叉树:

建立预置的二叉树本质上与实现链表差不多,只不过是在节点中增加多一个索引“指针”,先是把每个节点实例化为一个个孤立的节点,之后通过一定的顺序把节点连接起来。这样简单的二叉树就可以建立起来,在二叉树当中,满二叉树、完全二叉树是相对简单一点的,但是一般的二叉树还是会有一定的难度,在中间的某处的节点得度为一,这个是非常头疼的,但是我们可以把它想成完全二叉树来构建,在度为一的节点处以特殊的标志来代表空节点以及该节点的子树在建立完全二叉树时候,我们可以把所有的双亲节点单独出来,其中最后一个双亲节点再从双亲节点当中单独出来,以便对最后一(两)个叶子做处理

/**
	 * 建立二叉树
	 */
	public void creadTree( ){
		//创建孤立节点
		for(int i=0;i<array.length;i++){
			TreeNode tNode=new TreeNode(array[i],null,null);
			list.add(tNode);
		} 
		//遍历双亲节点,不包括最后一个双亲节点
		for(int i=0;i<list.size()/2-1;i++){
			//建立左子树的链接
			list.get(i).setLNode(list.get(i*2+1));
			//建立有子树的链接
			list.get(i).setRNode(list.get(i*2+2));
		}
		//最后一个双亲节点建立左节点的链接
		list.get(list.size()/2-1).setLNode(list.get((list.size()/2-1)*2+1));
		//若存在右节点则建立右节点
		if((list.size()/2-1)*2+2<list.size()){
			list.get(list.size()/2-1).setLNode(list.get((list.size()/2-1)*2+2));
		}
	}

 树的遍历通过递归是最简单的方法,但是在递归当中一定的处理递归出口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值