单链表
对于数据结构来说,是用来存取数据的。
算法是针对于数据结构的应用,而算法的设计又要以数据结构为载体来进行创建。
想要以单链表来操作数据,最常用的是增删改查。
链表属于线性结构,在逻辑上是相邻的数据结构,但是在物理上有可能又是毫无关系的。
在对链表进行操作的时候,有一个头节点是非常容易来进行操作的。
但是对于添加来说,一定要注意空指针的异常,所以要在进行添加的时候要利用好head头结点。
定义结点
public class PersonNode {
public Integer id;
public String personName;
public PersonNode next;
public PersonNode(Integer id, String personName, PersonNode next) {
this.id = id;
this.personName = personName;
this.next = next;
}
public PersonNode(Integer id, String personName) {
this.id = id;
this.personName = personName;
}
@Override
public String toString() {
return "PersonNode{" +
"id=" + id +
", personName='" + personName + '\'' +
", next=" + next +
'}';
}
}
定义链表:
public class PersonNodeList {
private PersonNode head = new PersonNode(-1,null,null);
public void add(PersonNode node){
PersonNode temp = head;
while (true){
if (temp.next==null){
break;
}
// 因为程序执行到了这里,那么这里temp.next一定不会再试null了,不然就已经终止了
temp = temp.next;
}
temp.next = node;
}
public void orderAdd(PersonNode node){
PersonNode temp = head;
while (true){
// 确定终止条件
// 经过第一步操作之后,表明了链表中已经有数据了
// 首先确定,到大了最后,也没有发现大于它节点。
if (temp.next==null){
break;
}
if (temp.next.id == node.id){
throw new RuntimeException("不能存在着相同的id");
}
// 如果当前节点的下一个节点大于,那么需要进行插入
if (temp.next.id > node.id){
break;
}
// 都不满足,继续循环
temp = temp.next;
}
// 两种情况,第一个节点是空和最后一个节点是空的操作都是一样的
node.next = temp.next;
temp.next = node;
}
public void show(){
PersonNode p = head.next;
if (p==null){
System.out.println("空链表");
}
while (p!=null){
System.out.println("节点的id是:---->"+p.id+",对应的name是:---"+p.personName);
p = p.next;
}
}
public void update(PersonNode node){
PersonNode p = head.next;
boolean flag = false;
while (true){
// 这个是因为没有找到
if (p==null){
break;
}
// 这个是基于上面来的
if (p.id == node.id){
flag = true;
break;
}
p = p.next;
}
if (flag){
p.personName = node.personName;
}else {
System.out.println("没有找到对应的节点");
}
}
public void deleteById(Integer id){
PersonNode t = head;
boolean flag = false;
while (true){
if (t.next==null){
break;
}
if (t.next.id==id){
flag = true;
break;
}
t=t.next;
}
if (flag){
t.next = t.next.next;
}else {
System.out.println("没有找到");
}
}
}
对应的操作:
public class PersonListTest {
public static void main(String[] args) {
PersonNodeList personNodeList = new PersonNodeList();
personNodeList.orderAdd(new PersonNode(1,"guang"));
personNodeList.orderAdd(new PersonNode(3,"meng"));
personNodeList.orderAdd(new PersonNode(2,"xiang"));
personNodeList.orderAdd(new PersonNode(17,"xiang"));
personNodeList.orderAdd(new PersonNode(-9,"xiang"));
personNodeList.update(new PersonNode(-9,"jiayi"));
personNodeList.deleteById(-9);
personNodeList.show();
}
}
总结:有了头结点之后,操作第一个元素就和操作链表中的元素是一样的效果了。
从理论中来,到实践中去,最终回归理论