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图解