单链表是数据结构的基础知识
以下实现的是一些基本操作:
1.添加节点
2.返回节点
3.查找节点
4.删除节点
5.改变节点
6.删除类型节点
7.指定位置插入
8.倒数第K节点
9.得到链表长度
10.遍历输出链表
以下方法声明在不同的类中,为了方便阅读,将实现同一功能操作的方法放在一起显示
- 添加Person类节点(链表类的addPerson()方法调用节点类的add()方法):
public void addPerson(Person p){添加
if(this.root==null){//判断根节点
root=p;
}else{//若根节点不为空,递归调用
this.root.add(p);
}
++LENGTH;//链表长度加一
}
public void add(Person newPerson){节点类添加
if(this.next==null){//判断后继是否为空
this.next=newPerson;
}else{//若后继不为空,后继节点递归调用
this.next.add(newPerson);
}
}
- 返回指定姓名的节点(链表类中findPerson()方法调用节点类find()方法):
public Person findPerson(String name){//返回指定节点
return root.find(name);//调用find方法
}
public Person find(String name){//节点类查找
if(this.name.equals(name)){//判断当前节点
System.out.print("\n查找成功");
return this;
}else{
if(this.next!=null){//判断后继
return this.next.find(name);
}else{//若直到无后继也没有查到即不存在
System.out.println("\n查找失败,不存在"+name);
return null;
}
}
}
- 查找节点(链表类中的searchPerson()方法调用本类中的findPerson()方法):
public boolean searchPerson(String name){///查找是否存在指定节点
if(this.findPerson(name)!=null){//通过find方法查找指定节点遍历
return true;
}else{
return false;
}
}
- 删除节点(链表类中的deletePerson()方法调用节点类中的delete()方法):
public void deletePerson(String name){//删除给定名字的节点
if(this.searchPerson(name)){
--LENGTH;
System.out.println(name+"已经被删除");//只要能查的到,方可删除
if(this.root.getName().equals(name)){//判断根节点
this.root=this.root.next;//若是目标,删除
}else{//若根节点不是目标,调用节点类的delete方法
this.root.next.delete(root,name);
}
}else{
System.out.println("删除失败");
return;
}
}
public void delete(Person previous,String name){//节点类删除
if(this.getName().equals(name)){
previous.next=this.next;//删除操作
}else if(this.next!=null){//递归
this.next.delete(this, name);
}
}
- 改变指定节点(链表类中的changeAge()方法调用本类中的findPerson()方法和节点类中setAge()方法的方法,findPerson()方法上文已显示):
public void changeAge(String name,int newAge){///改变指定节点的年龄
Person p=new Person();
p=this.findPerson(name);//通过find方法查找所要改变的方法
if(p!=null){//查到就改变
System.out.println(",已将"+name+"的年龄更改为:"+newAge);
p.setAge(newAge);
}else{
System.out.println("不存在"+name+"的信息");
}
}
public void setAge(int age){设置年龄属性
this.age=age;
}
- 删除指定性别的节点(链表类中的deleteG()方法调用本类中的deletePerson()方法和节点类中的findG()方法,deletePerson()方法上文已显示):
public void deleteG(String gender){//删除所有指定性别对象
p=this.root.findG(gender);//得到一个指定性别的对象
this.deletePerson(p.getName());//删除
while(p.next!=null){//递归
p=p.next.findG(gender);
this.deletePerson(p.getName());
}
}
public Person findG(String gender){///节点类查找指定性别对象
if(this.gender.equals(gender)){//判断当前节点
return this;
}else{
if(this.next!=null){
return this.next.findG(gender);
}else{
return null;
}
}
}
- 指定位置插入节点(链表类中的insert()方法调用本类中的findPerson()方法):
public void insert(String name,Person data){/指定名字后位置插入
Person p=new Person();
p=this.findPerson(name);
if(p!=null){//插入操作
++LENGTH;
System.out.println("成功在"+name+"之后插入"+data.getName()+"的信息");
data.next=p.next;//插入操作
p.next=data;//插入操作
}else{
System.out.println("不存在"+name+"的信息");
}
}
- 得到当前链表中倒数第k个节点(链表类中的getK()方法):
public Person getK(int k){///得到倒数第k个节点
if(k>LENGTH||k<=0){//判断输入的k是否合法
System.out.println("不存在");
return null;
}else{
Person p=new Person();
p=this.root;
for(int i=1;i<=LENGTH-k;++i){
p=p.next;
}
return p;
}
}
- 得到链表长度(链表类中的getListLength()方法直接输出静态变量):
public static void getListLength(){///得到链表长度
System.out.println("当前链表长度为:"+LENGTH);
}
- 链表遍历输出(链表类中的printLink()方法调用节点类中的print()方法):
public void printLink(){/输出链表
System.out.println("当前链表包含信息如下:");
if(this.root!=null){
this.root.print();
}
}
}
public void print(){//节点类输出
System.out.println("姓名:"+this.getName()+"\t性别:"+this.getGender()+"\t\t年龄:"+this.getAge());
if(this.next!=null){//若后继不为空就递归调用
this.next.print();
}
}
}
- 疑问:
1.当添加一个相同节点类的对象时,链表的输出会出现异常,不知道哪里出问题了(求解)
2.链表的反转(求详细解释,网上看不太懂)