Java实现单双链表的基本操作

链表

链表是一种物理存储上不连续,但是逻辑上是连续有序的存储结构。链表由一系列结点组成(链表每一个元素成为节点)组成,节点可以动态生成。单链表 的节点由两部分组成,一个是存储数据的数据域,一个是存储下一个节点的地址的指针域。双链表 的节点由三部分组成,比单链表多了一个存储上一个节点地址的指针域。

图解链表

单链表

单链表

双链表

双链表

代码实现

单链表

节点类的实现

//节点类
public class GoodsNode {
    public int id;
    public String name;
    public double price;
    public GoodsNode next;  //指向下一节点

    public GoodsNode(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
    @Override
    public String toString() {
        return "GoodsNode{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

基本操作的实现

public class DLinkedList {
    //头节点
    private  GoodsNode node = new GoodsNode(0,"",0.0);
    
    //往链表里添加节点
    public void add(GoodsNode goodsNode){
        GoodsNode temp = node; //定义一个临时节点等于头节点
        while (true){ //循环查找节点
            if (temp.next == null){
                break;  //没有下一个节点时跳出循环
            }
            temp = temp.next; //将下一个节点的赋值给临时节点
        }
        temp.next = goodsNode; //添加节点
    }

    //按照id值插入节点,id从小到大添加
    public void insert(GoodsNode goodsNode){
        GoodsNode temp = node;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.id > goodsNode.id){
                break;
            }else if (temp.next.id == goodsNode.id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            System.out.println("不能添加重复元素");
        }else {
            goodsNode.next = temp.next;
            temp.next = goodsNode;
        }
    }

    //修改节点
    public void update(GoodsNode goodsNode){
         // 如果链表为空
        if (node.next == null){
            System.out.println("链表为空");
            return;
        }
        GoodsNode temp = node.next;
        boolean flag = false;
        while (true){
            if (temp == null){
                break;
            }
            if (temp.id == goodsNode.id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = goodsNode.name;
            temp.id = goodsNode.id;
        }else {
            System.out.println("没有找到目标节点");
        }
    }

    //删除节点
    public void delete(int id){
        GoodsNode temp = node;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.id == 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;
        }
        GoodsNode temp = node.next;
        while (true){
            if (temp == null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }

    //统计节点个数,不算头节点
    public int getLength(){
        if (node.next == null){
            System.out.println("空链表");
            return 0;
        }
        GoodsNode temp = node.next;
        int length = 0;
        while (temp != null){
            length++;
            temp = temp.next;
        }
        return length;
    }
}

基本操作的测试

public static void main(String[] args) {
        DLinkedList linkedList = new DLinkedList();
        System.out.println("==================顺序添加=====================");
        GoodsNode goodsNode = new GoodsNode(1,"耐克",599.0);
        GoodsNode goodsNode1 = new GoodsNode(2,"李宁",699.0);
        GoodsNode goodsNode2 = new GoodsNode(3,"乔丹",499.0);
        GoodsNode goodsNode3 = new GoodsNode(4,"阿迪",599.0);
        linkedList.add(goodsNode);
        linkedList.add(goodsNode1);
        linkedList.add(goodsNode3);
        linkedList.list();
        System.out.println("===================随机插入==========================");
        linkedList.insert(goodsNode2);
        linkedList.insert(goodsNode1); //插入相同的节点
        linkedList.update(new GoodsNode(1,"xiao",299.9)); //修改节点
        linkedList.delete(1); //删除节点
        linkedList.list();
    }

运行结果
运行结果

双链表

节点类的实现

//节点类
public class BookNode {
    public int id;
    public String name;
    public double price;
    public BookNode next; //指向下一个节点
    public BookNode pre; //指向上一个节点
    public BookNode(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
    @Override
    public String toString() {
        return "BookNode{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

基本操作的实现

public class SLinkedList {
    //头节点
    private BookNode head = new BookNode(0,"",0.0);
    
    //添加节点 尾部添加
    public void addList(BookNode bookNode){
        BookNode temp = head;
        while (true){
            //链表为空
            if (temp.next == null){
                break;
            }
            temp = temp.next;
        }
        temp.next = bookNode;
        bookNode.pre = temp;
    }

    //修改节点
    public void update(BookNode bookNode){
        //是否是空链表
        if (head.next == null){
            System.out.println("空链表");
            return;
        }
        BookNode temp = head.next;
        boolean flag = false;
        while (true){
            if (temp == null){
                break;
            }
            if (temp.id == bookNode.id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = bookNode.name;
            temp.price = bookNode.price;
        }else {
            System.out.println("未找点节点");
        }
    }

    //删除节点
    public void delNode(int id){
        BookNode temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.id == id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.next = temp.next.next;
            if (temp.next.next != null){
                temp.next.next.pre = temp;
            }
        }else {
            System.out.println("未找到节点");
        }
    }

    //插入节点
    public void insert(BookNode bookNode){
        BookNode temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.id > bookNode.id){
                break;
            }else if (temp.next.id == bookNode.id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            System.out.println("不能插入重复元素");
        }else {
            bookNode.next = temp.next;
            temp.next = bookNode;
            bookNode.pre = temp;
            temp.next.pre = bookNode;
        }
    }

    //查看所以节点值
    public void list(){
        if (head.next == null){
            System.out.println("空链表");
            return;
        }
        BookNode temp = head.next;
        while (temp != null){
            System.out.println(temp);
            temp = temp.next;
        }
    }
}

基本操作的测试

public static void main(String[] args) {
        BookNode bookNode = new BookNode(1,"c语言",39.9);
        BookNode bookNode2 = new BookNode(2,"java",49.9);
        BookNode bookNode3 = new BookNode(3,"c++",59.9);
        BookNode bookNode4 = new BookNode(4,"linux",49.9);
        SLinkedList linkedList = new SLinkedList();
        System.out.println("==================顺序添加=====================");
        linkedList.addList(bookNode);
        linkedList.addList(bookNode2);
        linkedList.addList(bookNode4);
        linkedList.list();
        System.out.println("===================随机插入==========================");
        linkedList.insert(bookNode3);
        linkedList.insert(bookNode2);  //添加重复节点
        linkedList.delNode(1); //删除节点
        linkedList.update(new BookNode(2,"java进阶",69.9));
        linkedList.list();
    }

运行结果
运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值