【数据结构--链表】单链表的具体实现

19 篇文章 0 订阅
7 篇文章 0 订阅

链表

1.链表的介绍

链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

物理空间上的存储结构:

在这里插入图片描述

说明:

在java中不存在指针,这里的指针成员指的是后继结点或前驱结点,只是为了表示方便仍然采用"指针"一词。

2.链表的特点

  • 链表是以结点的形式存储的,是链式存储

  • 每个结点包括data区域和next区域

  • 各个结点并不是连续存储的

  • 链表有带头结点链表和不带头结点链表:

    带头结点链表逻辑结构:
    在这里插入图片描述

单链表的实现

单链表就是每个结点只设置一个指向其后继结点的指针成员。

在单链表中,当访问过一个结点后,只能接着访问它的后继结点,无法访问它的前驱结点。

需求:

根据带有头部的单链表,实现商品的增删改查,并且也可以针对商品已编号进行排序,完成排行榜。

public class LinkNode {
    public int id;
    public String name;
    public double price;
    public LinkNode next;

    public LinkNode(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public String toString(){
        return "LinkNode{"+"id="+id+",name="+name+",price="+price+'}';
    }
}

public class DLLinkedList {

    private LinkNode node=new LinkNode(0,"",0.0);

    //往链表中添加结点,在链表的尾端
    public void add(LinkNode node1){
        LinkNode temp=node;
        while(true){
            if(temp.next==null){
                break;
            }
            temp=temp.next;
        }
        temp.next=node1;
    }
    /**
     * 按照商品编号id值进行添加,id值按照从小到大的顺序
     */
    public void addOrder(LinkNode node2){
        LinkNode temp=node;
        boolean flag=false;
        while (true){
            if(temp.next==null){
                break;
            }
            if(temp.next.id>node2.id){
                break;
            }else if(temp.next.id==node2.id){
                flag=true;
                break;//相等id,不插入,去重
            }
            temp=temp.next;
        }
        if(flag){
            System.out.println("已经存在该商品,不能添加重复元素");
        }
        else{
            node2.next=temp.next;
            temp.next=node2;
        }
    }
    /**
     * 修改结点
     * 1.先找到结点中的目标节点
     * 2.根据新数据修改
     * 3.根据商品编号查找
     */
    public void update(LinkNode node3){
        //如果为空链表
        if (node.next==null){
            System.out.println("空链表");
            return;
        }
        LinkNode temp=node.next;
        boolean flag=false;//表示找到
        while (true){
            if(temp==null){
                break;
            }
            if (temp.id== node3.id){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag){
            //修改结点
            temp.name=node3.name;
            temp.id=node3.id;
        }
        else {
            System.out.println("未找到目标结点");
        }
    }
    /**
     * 结点的删除,根据结点编号
     */
    public void delete(LinkNode node4){
        LinkNode temp=node;
        boolean flag=false;
        while (true){
            if(temp.next==null){
                break;
            }
            if (temp.next.id==node4.id){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            temp.next=temp.next.next;
        }else {
            System.out.println("未找到删除结点");
        }
    }
    /**
     * 查看链表中每个结点元素
     */
    public void list(){
        if(node.next==null){
            System.out.println("空结点");
            return;
        }
        LinkNode temp=node.next;
        while(true){
            if(temp==null){
                break;
            }
            System.out.println(temp);
            temp=temp.next;
        }
    }
}

public class LinkedTest {
    public static void main(String[] args) {

        DLLinkedList linkedList=new DLLinkedList();

        LinkNode node1=new LinkNode(1,"naike",599.00);
        LinkNode node2=new LinkNode(2,"tebu",399.00);
        LinkNode node3=new LinkNode(3,"adi",699.00);
        LinkNode node4=new LinkNode(4,"lining",499.00);

        //添加
        linkedList.add(node1);
        linkedList.add(node2);
        linkedList.add(node3);
        linkedList.add(node4);
        linkedList.list();

        //修改
        linkedList.update(new LinkNode(2,"qiaodan",288.00));
        linkedList.list();

        //删除
        linkedList.delete(node4);
        linkedList.list();

//        添加后排序
        linkedList.addOrder(node2);
        linkedList.addOrder(node1);
        linkedList.addOrder(node3);
        linkedList.addOrder(node4);
        linkedList.list();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢靠窗坐.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值