单向链表基本概念
逻辑结构:线性结构
存储结构(内存的存储的方式):链式存储
与数组比较,逻辑结构相同都是线性结构
不同:数组的存储结构是顺序存储
单向链表的组成
- 单向链表由节点组成(Node)
2.每个节点里有存储的数据,和下一个节点的位置
创建节点(包含数据和下一个节点的地址)
public class Node(){
//学生名字
String name;
//学号
int id;
//下一个节点的地址
Node next;
//构造方法
public Node(String name,int id){
this.name=name;
this.id=id;
next=null;
}
}
创建链表
- 包含头节
- 包含节点的添加输出等方法
public class LinkedList(){
//头节点,不存储数据。只是指向下一个节点的位置
//默认为空字符串,和0
Node head=new Node(" ",0);
}
- 链表添加新节点方法(默认添加到链表尾部)
//参数要添加的节点
public void add1(Node newNode){
//需要一个临时节点保存头节来遍历链表,没有临时节点无法遍历
//因为遍历的过程中要不断对节点进行赋值
Node temp=head;
// 当循环到null时表示到链表尾部,结束循环
while(temp!=null){
//下一个节点的位置进行赋值
temp=temp.next;
}
//将新节点插入链表尾部
temp=newNode;
}
- 链表删除节点方法
//方法参数传入要删除节点 学号即ID
public void dele(int id){
//创建临时变量遍历链表
Node temp=head;
//判断链表是否为空
if(temp.next==null){
//结果为真则结束方法
return;
}
// 遍历链表
while(temp!=null){
//判断是否是要删除的 下一个节点
//要删除节点, 即且断节点。不能找到当前的节点,因为当前节点只是记录下一个节点的位置
//所以要找到要删除节点的上一个节点,把下一个节点的位置修改成下下个节点的位置
if(temp.next.id==id){
return;
}
}
//删除节点操作
temp.next=temp.next.next;
}
- 链表查询
//传入要查询 学生 名字 返回该学生的节点
public Node looking (String name){
//遍历链表
Node temp=head.next;
//判断链表是否为空
if(temp.next==null){
return null;
}
while(temp!=null){
//判断当前节点是否是要查询的节点,是反回节点
if(temp.name.equals(name)){
return temp;
}
//下一个节点
temp=temp.next;
}
return null;
}
- 链表节点的修改
//传入要修改的 新节点 修改名字
public void revise(Node reNode){
temp=head.next;
//判断队列是否为空
if(temp==null){
return;
}
//遍历链表
while(temp!=null){
//判断是否是要修改的节点
if(temp.id==reNode.id){
temp.name=reNode.name;
return;
}
}
}
- 单向链表根据学号大小进行添加 (从小到大)
public void add2(Node newNode){
//遍历链表
temp=head.next;
while(temp.next!=null){
/*temp的下一个节点与新节点 的id进行比较,如果temp下一个节点 小于新节点
则表示插入temp后面,最后为null则加入链表尾部*/
if(temp.next.id>id){
break;
}
temp=temp.next;
}
//新节点记录下一个节点的地址(比这个新加入节点大的id)
newNode.next=temp.next;
//在temp后插入入新节点
temp.next=newNode
}
总结:
在单向链表中添加删除时,遍历链表时不能直接遍历要添加的位置或要删除的位置,因为单向链表,当前节点只能找到后面的节点不能往前找。所以要删除或添加时要找到要添加或删除的前一个节点。然后进行添加删除操作。