JAVA实现单项循环排序链表及对应的思路

前奏:

链表的特点:是各个相依节点的地址空间不一定是连续的所以这样就充分利用的内存中的碎片内存
节点代码
public class MyNode {
    public Object objectValue; //节点类内容

    public MyNode nextNode;     //当前节点的下一个相依节点

    public MyNode(Object objectValue){
        this.objectValue=objectValue;
    }

    @Override
    public String toString() {
        return "当前节点:"+objectValue+"===下一个相依节点:"+(nextNode==null?"空":nextNode.objectValue);
    }
}

单项排序链表添加图解

在这里插入图片描述

添加排序代码
public class MyLinkList {    
	//创建头节点(用于牵引整个链表的第一个节点信息)
    MyNode headNode=new MyNode(null);
    
	public void addLinkOrderBy(Object objValue){
	        //获取头结点 作用
	        MyNode currNode=headNode;
	        //创建一个节点对象
	        MyNode newNode=new MyNode(objValue);
	
	        //创建一个变量用于存储当前节点信息
	        MyNode temporary=null;
	        while(currNode.nextNode!=null){
	            temporary=currNode.nextNode;
	            if((Integer)temporary.objectValue>(Integer)objValue){
	                break;
	            }
	            //更新当前节点信息
	            currNode=temporary;
	        }
	        if(currNode.nextNode==null){
	            currNode.nextNode=newNode;
	        }else{
	            //将当前节点的下一个相依节点给新节点的相依节点
	            newNode.nextNode=currNode.nextNode;
	            currNode.nextNode=newNode;
	        }
	    }
    }

单项排序链表删除图解

在这里插入图片描述

删除代码
    public void delete(Object delValue){
        //获取头节点信息
        MyNode currNode=headNode;
        //创建一个变量用于存储当前节点信息
        MyNode temporary=null;
        while(currNode.nextNode!=null){
            //获取当前节点,对应的下一个相依节点
            temporary=currNode.nextNode;
            if((Integer)temporary.objectValue==(Integer)delValue){
                break;
            }
            //更新当前节点信息
            currNode=temporary;
        }
        if(currNode.nextNode==null){
            throw new RuntimeException("没有对应的链表信息,无法删除");
        }else{
            currNode.nextNode=currNode.nextNode.nextNode;
        }
    }

单项循环排序链表思路 图解

注意:不带头结点的

在这里插入图片描述

写法思考的5个问题 如果把5个问题处理好你就会单项循环链表了
			1:由于是循环链表如果情况下判断链表是为最后一个怎么处理
			2:当链表一开始为空的时候添加节点怎么处理
			3:当添加的节点在链表最前怎么去处理
			4:当添加的节点在链表中间怎么去处理
			5:当添加的节点在链表最后面怎么去处理

代码

public void addNodeOrderBy(Object value){

		//获取头节点(牵引整个链表中第一个有效节点信息)
        MyNode currNode=headNode;
        
        //创建一个临时遍历,存储当前节点向下相依节点信息
        MyNode temporary=null;
        
 	while(currNode.nextNode!=null){
            //获取当前节点向下相依节点信息
            temporary=currNode.nextNode;
            if((Integer)temporary.objectValue>(Integer)objValue){
                break;
            }
            //更新当前节点信息
            currNode=temporary;
            if(currNode.nextNode==headNode.nextNode){
                //代表已经循环到最后一个了且没有匹配成功 跳出
                break;
            }
        }
        //表示一开始都没有值考虑步骤
        if(currNode.nextNode==null){
            //将当前新节点向下相依节点的内容值为本身
            newNode.nextNode=newNode;

            //将新节点赋值给当前节点的向下相依节点上
            currNode.nextNode=newNode;

        //表示当前新节点是最小的节点考虑步骤
        }else if(currNode==headNode){


            //提示:表示当前的新添加内容为最小内容所以要对末尾的节点向下相依节点地址要更改才当前新节点

            //获取末尾节点信息
            MyNode lastNode=headNode;
            while(lastNode.nextNode!=null){
                //获取当前节点向下相依节点信息
                temp=lastNode.nextNode;
                //更新当前节点信息
                lastNode=temp;
                if(lastNode.nextNode==headNode.nextNode){
                    //代表已经循环到最后一个了且没有匹配成功 跳出
                    break;
                }
            }
            //更新末尾节点中向下相依节点的地址
            lastNode.nextNode=newNode;
            //将当前新节点向下相依节点内容更新为当前节点向下相依节点内容
            newNode.nextNode=currNode.nextNode;
            //将当前新节点中的内容赋值给当前节点向下相依节点信息
            currNode.nextNode=newNode;

        //表示最后一个内容
        }else if(currNode.nextNode==headNode.nextNode){
        
            //将新节点中的向下相依节点信息地址跟新为当前节点向下相依节点信息
            newNode.nextNode=currNode.nextNode;
            //将当前节点向下相依节点信息更新为新节点信息
            currNode.nextNode=newNode;

        }else{
            //将当前新节点向下相依节点内容更新为当前节点向下相依节点内容
            newNode.nextNode=currNode.nextNode;
            //将当前新节点中的内容赋值给当前节点向下相依节点信息
            currNode.nextNode=newNode;
        }
 }
注意:带头结点的 图解

在这里插入图片描述

写法思考的4个问题 如果把4个问题处理好你就会单项循环链表了
			1:由于是循环链表如果情况下判断链表是为最后一个怎么处理
			2:当链表一开始为空的时候添加节点怎么处理
			3:当添加的节点在链表最后面怎么去处理
			4:当添加的节点在链表中间怎么去处理
代码
public void addNodeOrderBy(Object objValue){

		//获取头节点(牵引整个链表中第一个有效节点信息)
        MyNode currNode=headNode;
        
        //创建一个临时遍历,存储当前节点向下相依节点信息
        MyNode temp=null;

        while(currNode.nextNode!=null&&currNode.nextNode!=headNode){
            //获取当前节点向下相依节点信息
            temp=currNode.nextNode;

            if((Integer)temp.objectValue>(Integer)objValue){
                break;
            }
            //更新当前节点信息
            currNode=temp;
        }

        if(currNode.nextNode==null||currNode.nextNode==headNode){
            //将新节点向下相依节点中的内容更新为头节点信息
            newNode.nextNode=headNode;
            //将新节点赋值给当前节点向下相依节点上
            currNode.nextNode=newNode;

        }else{
            //将当前节点向下相依节点的信息赋值给新节点向下相依节点上
            newNode.nextNode=currNode.nextNode;

            //将新节点信息赋值给 当前节点向下相依节点上
            currNode.nextNode=newNode;
        }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值