数据结构与算法(单向链表结构)

单向链表的运算操作。

//链结点的封装类
public class Link {

    public int age;
    public Link next;  //指向该链结点的下一个链结点

    //构造方法
    public Link(int age){
        this.age = age;
    }

    //打印该链结点的信息
    public void displayLink(){
        System.out.println("age:"+age);
    }
    //打印该结点下的所有结点的信息
    public void printlnLink(Link link){
        link.displayLink();
        if(link.next != null){
            printlnLink(link.next);
        }
    }
    //while循序打印,和上面打印结果的一样
    public void printlnLink(Link link){
        while(link != null){
            link.displayLink();
            link = link.next;
        }
    }
}
//链表的封装类
public class LinkList {

    public static void main(String[] args) {
		//插入结点
        LinkList linkList = new LinkList();
        linkList.insertFirst(new Link(1));
        linkList.insertFirst(new Link(2));
        linkList.insertFirst(new Link(3));
        //删除结点,打印该结点以及结点下的所有数据
        Link link = linkList.deleteFirst();
        link.printlnLink(link);
    }
    private Link first;  //指向链表中的第一个链结点
    
    public LinkList(){
        first = null;
    }

    //插入到链表的前端
    public void insertFirst(Link link){
    	/**
         *将已存在的结点赋值给新的结点的指针域中,新的结点已经改变,而原先的结点并没有改变
         * 然后将新的结点赋值给原先的结点,这样就完成了结点的插入,这样插入的设计的很巧妙
         */
        link.next = first;
        first = link;
    }
    //删除第一个链结点,返回删除的链结点引用
    public Link deleteFirst() throws Exception{
        if(isEmpty()){
            throw new Exception("链表为空!不能进行删除操作");
        }
        /**
         * 删除的并不一定是一个结点,只是取到了第一个结点的值
         * 该结点的指针域可能不为空,调用自定义方法printlnLink打印该结点及该结点下所有结点的数据
         */
        Link temp = first;
        first = first.next;
        return temp;
    }
    //删除属性为指定值的链结点
    public Link deleteByKey(int key){
        Link link = null; //要删除的结点
        Link cur = first; //当前结点
        Link next = first.next; //后结点
        Link previous = null; //前结点
        while(cur != null){
            if(cur.age == key){  //找到了要删除的链结点
                link = cur;
                //如果当前链结点的前驱为null,证明当其为链表的第一个链结点,删除该链结点后需要对first属性重新赋值
                if(previous ==null){
                    this.first =next;
                }else{
                    //删除操作,即将前驱的next指针指向当前链结点的next,链表中将去当前链结点这一环
                    previous.next= next;
                }
                break;
            }else if(cur.next ==null){  //当前链结点不是目标且下一个链结点为null,证明没有要删除的链结点
                break;
            }

            //当前链结点不是要删除的目标,则向后继续寻找
            next = next.next;
            /**
             *每一次previous的指针指向当前结点的上一个结点,当更改previous时候
             * 指针指向的地址的值也会发生改变,进而first中改地址中的值也会发生相应的改变
             */
            previous = cur;
            cur = cur.next;
        }
        return link;
    }
	//查找属性为指定值的链结点
    public Link find(int key){
        Link link = null;
        Link cur = first;
        while(cur != null){
            if(cur.age == key){
                link = cur;
                break;
            }else if(cur.next == null){
                break;
            }
            cur = cur.next;
        }
        return link;
    }

    //判空
    public boolean isEmpty(){
        return (first == null);
    }
}

插入结点目录结构:
结构1
结构
删除结点的数据信息:
删除结点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值