Java单链表的实现
详细见注释
代码块
package 链表;
import java.util.Scanner;
/*
*链表是以接点的形式存储的
* 每个接点都有date域和指针next域:指向下一个接点
* 链表分带头节点与不带头的节点
* 链式存储
* */
/*
* 单链表的实现先创建一个head节点:中不存放任何数据只是引导链表的开始
* 先创建一个头节点后面我们每添加一个节点会向下移
* 通过辅助遍历进行遍历每一个节点
* */
public class Linked_list {
public static void main(String[] args) {
//进行测试
//创建节点
HerNode herNode2=new HerNode(9,"张飞","A");
HerNode herNode3=new HerNode(10,"曹操","B");
HerNode herNode4=new HerNode(8,"马超","C");
HerNode herNode5=new HerNode(5,"刘备","K");
HerNode herNode6=new HerNode(7,"宋飞","K");
HerNodeList herNodeList=new HerNodeList();
herNodeList.AddHerNode(herNode2);
herNodeList.AdHerNode(herNode3);
herNodeList.AdHerNode(herNode4);
herNodeList.AdHerNode(herNode5);
herNodeList.AdHerNode(herNode6);
herNodeList.ShowHerNodeList();
System.out.println("请输入你想要查找的人名");
Scanner scanner = new Scanner(System.in);
String name=scanner.next();
herNodeList.SelectHerNodeName(name);
System.out.println("请输入你想要查找的人名,修改的编号和昵称");
String name2=scanner.next();
int no1=scanner.nextInt();
String noname=scanner.next();
herNodeList.ModifyHerNodeList(name2,no1,noname);
/* herNodeList.New_order();*/
System.out.println("修改后的链表");
herNodeList.ShowHerNodeList();
}
}
//创建一个HerNodeList来管理节点(就是一个链表)
class HerNodeList{
//创建一个头节点不存放一个数据
private HerNode herNode=new HerNode(0," "," ");
//创建,节点
public void AddHerNode(HerNode herNode1){
//因为头节点不能动所以用一个临时变量进行遍历,
//遍历是为了找到节点为好添加下一个节点
HerNode temp=herNode;//用一个temp(指针)指向第一个头节点
//遍历整个链表找到最后
while(temp.next!=null){
temp=temp.next;
}
temp.next=herNode1;//指针是至指向下一个节点的,最后一个指针的next==null;
}
//显示节点,遍历整个链表
public void ShowHerNodeList(){
//判断链表是否为空,
if(herNode.next==null){
System.out.println("链表为为空……");
}
//因为头节点不能动所以的用一个变量进行遍历
HerNode temp=herNode.next;
while (temp!=null){//不能是temp.next!=null,这样就会只循环到倒数第二个节点就会终止运行
System.out.println(temp);
temp=temp.next;//节点后移
}
}
public void SelectHerNodeName(String name1){
//创建一个变量,头节点不能动
//判断链表是否为空,
if(herNode.next==null){
System.out.println("链表为为空……,查无此人");
return;
}
HerNode temp=herNode.next;
while (true){
if (temp.name.equals(name1)){
System.out.println("为您找到名字为"+name1+"的节点,节点信息为如下");
System.out.println(temp);
return ;
}
temp=temp.next;
if (temp==null){
System.out.println("已经查找到链表尾,链表中没有此人");
return;
}
}
}
public void ModifyHerNodeList(String name1,int no1,String noname){
//创建一个变量,头节点不能动
//判断链表是否为空,
if(herNode.next==null){
System.out.println("链表为为空……,查无此人");
return;
}
HerNode temp=herNode.next;
while (true){
if (temp.name.equals(name1)){
System.out.println("为您找到名字为"+name1+"的节点,节点信息修改为如下");
temp.no=no1;
temp.anthername=noname;
/*HerNode temp2=herNode;//编号更改从新排序
while (true){
if (temp2.next == null){
break;
}
if (temp2.no>temp2.next.no){
HerNode temp3;
temp3=temp2.next;
temp2.next=temp2;
temp2=temp3;
}
temp2=temp2.next;
}*/
System.out.println(temp);
return ;
}
temp=temp.next;
if (temp==null){
System.out.println("已经查找到链表尾,链表中没有此人");
return;
}
}
}
//在添加节点时放在指定的位置
//如果用排名则添加失败,返回提示
public void AdHerNode(HerNode herNode8){
//因为头节不能动所以的需要一个辅助指针去找到要添加的位置
//得找到需要添加的位置的前一个位置让你要添加的节点被指向上一个节点的下一个指针;
if (herNode.next == null){
System.out.println("链表为空……");
return;
}
HerNode temp=herNode;
boolean flag=false;//标识添加节点
while (true){
if (temp.next==null){
break;
}
if (temp.next.no>herNode8.no){//找到位置//跳出来会保留temp的位置temp下一个位置的值大于你想要添加的位值这样就会实现降序排列
break;
}
if (temp.no==herNode8.no){
flag=true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println("你想要的添加的位置编号"+herNode8.no+"已经存在不能添加");
}else {
herNode8.next=temp.next;
temp.next=herNode8;
}
}
/* public void New_order(){
HerNode temp2=herNode;//编号更改从新排序
while (temp2.next!= null) {
if (temp2.no > temp2.next.no) {
HerNode temp3;
temp3 = temp2.next;
temp2.next = temp2;
temp2 = temp3;
}
temp2 = temp2.next;
}
}*/
}
//节点就是一个类的对象
//创建一个节点,每一个节点就是一个对象
class HerNode{
public int no;
public String name;
public String anthername;
public HerNode next;
public HerNode(int no, String name, String anthername ) {
this.no = no;
this.name = name;
this.anthername = anthername;
}
//为了显示明显从写Tostring方法
@Override
public String toString() {
return "HerNode{" +
"no=" + no +
", name='" + name + '\'' +
", anthername='" + anthername + '\'';
}
}
测试用例:
HerNode{no=5, name=‘刘备’, anthername=‘K’
HerNode{no=7, name=‘宋飞’, anthername=‘K’
HerNode{no=8, name=‘马超’, anthername=‘C’
HerNode{no=9, name=‘张飞’, anthername=‘A’
HerNode{no=10, name=‘曹操’, anthername=‘B’
请输入你想要查找的人名
马超
为您找到名字为马超的节点,节点信息为如下
HerNode{no=8, name=‘马超’, anthername=‘C’
请输入你想要查找的人名,修改的编号和昵称
张飞
8
lk
为您找到名字为张飞的节点,节点信息修改为如下
HerNode{no=8, name=‘张飞’, anthername=‘lk’
修改后的链表
HerNode{no=5, name=‘刘备’, anthername=‘K’
HerNode{no=7, name=‘宋飞’, anthername=‘K’
HerNode{no=8, name=‘马超’, anthername=‘C’
HerNode{no=8, name=‘张飞’, anthername=‘lk’
HerNode{no=10, name=‘曹操’, anthername=‘B’