1.链表介绍
链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。
2.特点
- 链表是以结点形式存储的,是链式存储
- 每个结点包含data区域和next区域
- 各个结点并不是连续存储的
- 链表分带头结点链表和没有带头结点链表,根据实际的需求来确定带头结点链表逻辑结构
3.单向链表的增删改查
结构图:
package linked02;
/**
* @author WuChenGuang
*/
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 linked02;
/**
* @author WuChenGuang
*/
public class DLLinkedList {
private GoodsNode node = new GoodsNode(0, "", 0.0);
/**
* 向链表中添加节点
*/
public void add(GoodsNode goodsNode) {
GoodsNode temp = node;
while (temp.next != null) {
temp = temp.next;
}
temp.next = goodsNode;
}
/**
* 按照商品编号id值进行添加,从小到大的顺序添加
*/
public void addOrder(GoodsNode goodsNode) {
GoodsNode temp = node;
boolean flg = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id > goodsNode.id) {
break;
// 去除重复的id值
} else if (temp.next.id == goodsNode.id) {
flg = true;
break;
}
temp = temp.next;
}
if (flg) {
System.out.println("已经存在了该商品,不能添加重复元素");
} else {
goodsNode.next = temp.next;
temp.next = goodsNode;
}
}
/**
* 修改节点
* 1.先找到链表中目标节点,
* 2.根据新的数据修改
* 3.根据商品编号进行查找,
*/
public void updateNode(GoodsNode goodsNode) {
// 如果链表空
if (node.next == null) {
System.out.println("链表为空...");
return;
}
GoodsNode temp = node.next;
// 标识符,表示找到了节点
boolean flg = false;
while (true) {
if (temp == null) {
break;
}
if (temp.id == goodsNode.id) {
flg = true;
break;
}
temp = temp.next;
}
if (flg) {
// 真正修改节点
temp.name = goodsNode.name;
temp.price = goodsNode.price;
} else {
System.out.println("在整个链表中未找到目标节点...");
}
}
/**
* 节点删除功能
* 条件:根据节点的编号删除
*/
public void delNode(int id) {
GoodsNode temp = node;
boolean flg = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id == id) {
flg = true;
break;
}
temp = temp.next;
}
if (flg) {
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 (temp != null) {
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;
}
}
package linked02;
/**
* @author WuChenGuang
*/
public class DLLinkedListTest {
public static void main(String[] args) {
DLLinkedList dlLinkedList = new DLLinkedList();
GoodsNode iphone11 = new GoodsNode(1, "iphone11", 3999.0);
GoodsNode iphone12 = new GoodsNode(2, "iphone12", 4999.0);
GoodsNode iphone13 = new GoodsNode(3, "iphone13", 5999.0);
GoodsNode iphone14 = new GoodsNode(4, "iphone14", 6999.0);
/*// 按顺序添加元素
dlLinkedList.add(iphone11);
dlLinkedList.add(iphone12);
dlLinkedList.add(iphone13);
dlLinkedList.add(iphone14);*/
// 随机添加元素
dlLinkedList.addOrder(iphone12);
dlLinkedList.addOrder(iphone14);
dlLinkedList.addOrder(iphone11);
dlLinkedList.addOrder(iphone13);
/*// 修改元素
dlLinkedList.updateNode(new GoodsNode(2, "iphone12 mini", 3999.0));*/
/*// 删除元素
dlLinkedList.delNode(3);*/
// 展示数据
System.out.println("当前节点的个数:" + dlLinkedList.getLength());
dlLinkedList.list();
}
}