0
点赞
收藏
分享

微信扫一扫

Java数据结构与算法——单向链表

颜路在路上 2022-03-12 阅读 44

1.简介


2.单向链表


3.代码案例

package com.szh.unidirectional;

/**
 *
 */
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 +
                '}';
    }
}
package com.szh.unidirectional;

/**
 *
 */
public class DLLinkedList {

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

    //在单向链表末尾插入节点
    public void addLast(GoodsNode goodsNode) {
        GoodsNode temp = node; //辅助变量
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = goodsNode;
    }

    //在单向链表中间某个位置插入节点
    public void addOrder(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 updateNode(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.price = goodsNode.price;
        } else {
            System.out.println("在整个链表中未找到目标节点....");
        }
    }

    //删除单向链表的某个节点
    public void deleteNode(int id) {
        //如果链表为空
        if (node.next == null) {
            System.out.println("链表为空....");
            return;
        }
        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; //辅助变量
        int index = 0;
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println("第 " + (++index) + " 个节点元素为:" + temp);
            temp = temp.next;
        }
        //System.out.println("此单向链表中共有 " + index + " 个节点元素。");
    }

    //统计单向链表中节点的个数
    public int getNodeNum() {
        //如果链表为空
        if (node.next == null) {
            System.out.println("链表为空....");
            return 0;
        }
        GoodsNode temp = node.next;
        int num = 0;
        while (temp != null) {
            num++;
            temp = temp.next;
        }
        return num;
    }
}
package com.szh.unidirectional;

/**
 * 单向链表相关操作
 */
public class LinkedTest {
    public static void main(String[] args) {
        DLLinkedList dlLinkedList = new DLLinkedList();

        GoodsNode goodsNode1 = new GoodsNode(1, "西游记", 55.55);
        GoodsNode goodsNode2 = new GoodsNode(2, "水浒传", 66.66);
        GoodsNode goodsNode3 = new GoodsNode(3, "红楼梦", 88.88);
        GoodsNode goodsNode4 = new GoodsNode(4, "三国演义", 99.99);

        System.out.println("单向链表的插入操作:");
        dlLinkedList.addLast(goodsNode1);
        dlLinkedList.addLast(goodsNode3);
        dlLinkedList.addOrder(goodsNode4);
        dlLinkedList.addOrder(goodsNode2);
        dlLinkedList.list();
        System.out.println("此单向链表中共有 " + dlLinkedList.getNodeNum() + " 个节点元素。");
        System.out.println();

        System.out.println("单向链表的修改操作:");
        dlLinkedList.updateNode(new GoodsNode(3, "Java编程思想", 11.11));
        dlLinkedList.list();
        System.out.println("此单向链表中共有 " + dlLinkedList.getNodeNum() + " 个节点元素。");
        System.out.println();

        System.out.println("单向链表的删除操作:");
        dlLinkedList.deleteNode(2);
        dlLinkedList.list();
        System.out.println("此单向链表中共有 " + dlLinkedList.getNodeNum() + " 个节点元素。");
    }
}


4.单向链表的CRUD图解

 

举报

相关推荐

0 条评论