数据结构 链表

本文详细介绍了链表的基本操作,包括插入、查找、删除等,并通过示例代码展示了这些操作的具体实现过程。此外,还对比了链表与顺序表在不同操作上的效率差异。

1.核心思想

链表中只包含一个数据项,即对第一个链接点的引用。

2.实现链表

public class TestLinkList {
    public static void main(String[] args) {
        LinkList linkList=new LinkList();

        linkList.insert(40);
        linkList.insert(12);
        linkList.insert(23);
        linkList.insert(10);

        linkList.displayAll();  //10 23 12 40
    }
}

public class LinkList {
    private Link first;

    public void insert(long value){
        Link lnk=new Link(value);
        if(first==null){//链表为空,直接指向第一个链接点
            first=lnk;
        }
        else{//链表不为空,新链接点指向以前的first点,再将链表的first指向它自己
            lnk.setNext(first);
            first=lnk;//链表引用的永远是最新插入的链接点
        }
    }

    public void displayAll(){
        Link current=first;
        while(current!=null){//当链表为空,current.getNext()会报错
            System.out.println(current.getData());//将当前点的数据取出来
            current=current.getNext();//再指向下一个元素
        }
    }
}

3.查找指定节点

public static void main(String[] args) {
        LinkList linkList=new LinkList();

        linkList.insert(40);
        linkList.insert(12);
        linkList.insert(23);
        linkList.insert(10);

        linkList.displayAll();  //10 23 12 40
        System.out.println("找到节点,数据为:"+linkList.find(10).getData());
        //找到节点,数据为:10
    }

    //查找节点
    public Link find(long key){
        Link current=first;
        while(current.getData()!=key){
            if(current.getNext()==null){
            //找完了所有结点,还没找到
                return null;
            }
            current=current.getNext();
        }
        return current;
    }

4.添加指定结点
这里写图片描述

public static void main(String[] args) {
        LinkList linkList=new LinkList();

        linkList.insert(40);
        linkList.insert(12);
        linkList.insert(23);
        linkList.insert(10);

        linkList.insert(20,1);
        linkList.displayAll();//10 20 23 12 40
    }

    //添加结点到指定位置
    public void insert(long value,int pos){
        if (pos == 0) {
            insert(value);
        } else {
            Link current = first;
            for (int i = 0; i < pos - 1; i++) {
                //注意:i < pos - 1
                //当pos=1,因为first已经指向位置1,所以跳出for循环
                current = current.getNext();
            }

            Link lnk = new Link(value);
            lnk.setNext(current.getNext());//新结点指向原位置结点的next
            current.setNext(lnk);//原位置结点的next设为自己
        }   
    }

5.删除指定结点

    public static void main(String[] args) {
        LinkList linkList=new LinkList();

        linkList.insert(40);
        linkList.insert(12);
        linkList.insert(23);
        linkList.insert(10);

        linkList.displayAll();//10 23 12 40

        linkList.delete(10);
        linkList.displayAll();//23 12 40
    }

    //删除指定结点
    public void delete(long key){
        Link current=first;
        Link ago=first;//当前查找结点的上一个
        while(current.getData()!=key){
            if(current.getNext()==null){
                //找完了链表,找不到,返回
                return;
            }else{
                ago=current;
                current=current.getNext();
            }
        }

        if(current==first){
            //没有进入while循环,第一个结点就是指定删除结点
            first=first.getNext();
        }else{
    //当前结点是key,让它的前一个指向它的后一个        
    ago.setNext(current.getNext());
        }
    }

6.比较链表和顺序表

    public static void main(String[] args) {
        //构建链表
        LinkList linkList=new LinkList();
        Date date1=new Date();
        for(int i=0;i<1000000;i++){
            linkList.insert(i);
        }
        Date date2=new Date();
        System.out.println(date2.getTime()-date1.getTime());
        //每次都不一样,某次134ms

        //构建顺序表
        MyArray ma=new MyArray(1000001);
        date1=new Date();
        for(int i=0;i<1000000;i++){
            ma.insert(i);
        }
        date2=new Date();
        System.out.println(date2.getTime()-date1.getTime());
        //20ms,但实际链表更快,只需改变指针的指向(此程序未实现)

        date1=new Date();
        linkList.delete(999999);
        date2=new Date();
        System.out.println(date2.getTime()-date1.getTime());
        //0,实际上链表删除应更快


        date1=new Date();
        ma.delete(999999);
        date2=new Date();
        System.out.println(date2.getTime()-date1.getTime());
        //11,删除后每一位要移动,非常麻烦 
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值