再次看了下链表的教程视频 根据视频内容写了个单向链表的例子和一些常见的
public class singleLinkedListTest {
//单链表
public static void main(String[] args) {
//创建几个节点
node node1 = new node(1,"剑圣","打野");
node node2 = new node(2,"亚索","中单");
node node3 = new node(3,"螳螂","打野");
node node4 = new node(4,"蛮王","上单");
node node5 = new node(5,"猪妹","打野");
//创建一个链表
singleLinkedList lb = new singleLinkedList();
//将节点加入链表
// lb.add(node1);
// lb.add(node2);
// lb.add(node4);
// lb.add(node3);
// lb.add(node5);
//将节点按照排名加入链表
lb.orderadd(node1);
lb.orderadd(node5);
lb.orderadd(node2);
lb.orderadd(node4);
lb.orderadd(node3);
//查看修改前链表
lb.show();
lb.validDate();
System.out.println("---链表修改后---");
//修改节点3
node node3g = new node(3,"阿狸","中单");
lb.setNode(node3g);
//查看修改后链表
lb.show();
lb.validDate();
System.out.println("---链表删除后---");
//删除节点2
lb.deleteNode(node2);
//查看删除后链表
lb.show();
lb.validDate();
System.out.println("---链表反转后---");
//反转链表
lb.reversalList();
//查看反转后链表
lb.show();
lb.validDate();
}
}
//创建一个节点类
class node{
//每个节点包括 排名 名称 定位 和next指针域
public int ranking;
public String name;
public String location;
public node nodeNext;
public node(int ranking,String name,String location) {
this.ranking = ranking;
this.name = name;
this.location = location;
}
//重写toString方法 使节点更好表示
@Override
public String toString() {
return "node{" + "排名=" + ranking +
", 名称='" + name +
", 定位='" + location +
'}';
}
}
//创建一个链表类
class singleLinkedList {
//首先创建一个头指针(头指针不装数据 仅当作头指针使用)
static node headNode = new node(0,"","");
//反转链表
public void reversalList(){
//如果链表只有一个节点或没有节点则无需反转
if (headNode.nodeNext==null||headNode.nodeNext.nodeNext==null){
return;
}
node test = headNode.nodeNext;//辅助指针
node zc = null;//辅助指针
node newHeadNode = new node(0,"","");//新的头节点
while (test!=null){
//将当前节点的下一个节点存起来 用来让test跳到下一个用
zc = test.nodeNext;
//将当前节点连接到新的节点当前节点
test.nodeNext = newHeadNode.nodeNext;
//将新的节点连接到当前节点
newHeadNode.nodeNext = test;
//切换到下一个节点
test = zc;
}
//老节点头 = 新节点头
headNode.nodeNext = newHeadNode.nodeNext;
}
//查看链表有效数据的个数(链表长度)
public void validDate(){
//检查链表是否为空
if (headNode.nodeNext==null){
System.out.println("链表为空!");
return;
}
node test = headNode;
int count = 0;
while (test.nodeNext!=null){
count++;
test = test.nodeNext;
}
System.out.println("有效数据有"+count+"个");
}
//删除指定节点 在“删除后” 删除的那个节点就没有任何的引用 就会被垃圾回收机制给回收
public void deleteNode(node node){
//检查链表是否为空
if (headNode.nodeNext==null){
System.out.println("链表为空!");
return;
}
node test = headNode;
while (true){
//如果当前节点的下一个节点排名等于要删除的节点的排名 那么删除该节点并设置该节点的上一个节点的next指针并结束方法
if (test.nodeNext.ranking== node.ranking){
test.nodeNext = test.nodeNext.nodeNext;
return;
}
if (test.nodeNext==null){
System.out.println("未找到您要删除的节点");
return;
}
test = test.nodeNext;
}
}
//根据英雄的排名来修改节点信息(如果节点的所有属性都修改了 相当于添加节点了)
//传入目标节点修改后的样子
public void setNode(node newNode){
//检查链表是否为空
if (headNode.nodeNext==null){
System.out.println("链表为空!");
return;
}
node test = headNode;
while (true){
//如果当前节点的排名等于要修改的节点的排名 那么修改当前节点为传入的节点并结束方法
if (test.ranking== newNode.ranking){
test.name = newNode.name;
test.location = newNode.location;
return;
}
if (test.nodeNext==null){
System.out.println("未找到您要修改的节点");
return;
}
test = test.nodeNext;
}
}
//向链表添加节点的时候根据排名来插入到链表的相应位置
public void orderadd(node node){
//首先找新的节点应该插在哪里
node test =headNode;
while (true){
// System.out.println("排错");
//当已经找到尾部的时候结束循环
if (test.nodeNext==null){
break;
}
//当找到对应位置时跳出循环
//当当前节点的下一个节点的排名大于要插入的节点的排名
if (test.nodeNext.ranking > node.ranking){
break;
}
//当要插入的节点的排名在链表种已经出现过了 也就是无法插入的时候结束该方法不再添加
if (test.nodeNext.ranking== node.ranking){
System.out.println("该排名已有其他英雄,无法添加!");
return;
}
test = test.nodeNext;
}
//插入节点
node.nodeNext = test.nodeNext;
test.nodeNext = node;
}
//向链表添加节点
public void add(node node){
//首先找到链表的尾部 定义一个辅助变量
node test = headNode;
while (test.nodeNext!=null){
//如果当前节点的next指针不为空 那么test等于他指向的那个节点 以此向下寻找直到找到null
test = test.nodeNext;
}
//将新的节点连接至尾部
test.nodeNext = node;
}
//显示链表
public void show(){
//首先检查链表是否为空
if (headNode.nodeNext==null){
System.out.println("链表为空!");
return;
}
//还是定义一个辅组变量
node test = headNode;
while (test.nodeNext!=null){
//因为是从头节点开始的 头节点是不存储信息的 所以再输出之前test = 下一个节点
test = test.nodeNext;
//因为重写了toString方法 所以直接输出就可得到对应的信息
System.out.println(test);
}
}
}
*** 作
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)