链表
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();
}
}