单链表基本操作合集及详细注释(java语言描述1.添加节点 2.返回节点 3.查找节点 4.删除节点 5.改变节点 6.删除类型节点 7.指定位插入 8.倒数第K节点 9.链表长度10.链表输出)

单链表是数据结构的基础知识
以下实现的是一些基本操作:
1.添加节点
2.返回节点
3.查找节点
4.删除节点
5.改变节点
6.删除类型节点
7.指定位置插入
8.倒数第K节点
9.得到链表长度
10.遍历输出链表
节点类的声明,节点类中的方法主要由Link类调用链表类的声明,链表类中的方法由链表对象直接调用,其中的方法调用有的了节点类的方法
以下方法声明在不同的类中,为了方便阅读,将实现同一功能操作的方法放在一起显示

  • 添加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.链表的反转(求详细解释,网上看不太懂)

猜你喜欢

转载自blog.csdn.net/qq_44182424/article/details/88764986