单链表的java语言完整实现含添加删除节点

单链表是线性表的一种表示,一个单链表是一个个节点组成,节点是由数据域和链域两部分组成的,数据域就是这个节点要存储的数据,链域指示的是这个节点的下一个节点。java实现如下:

首先是节点类:PersonChainNode.java

//单链表节点实体
public class PersonChainNode {
	private Person person;//节点的属性,即节点的数据域部分
	private PersonChainNode pChain;//下一个节点,即节点链域
	
	//获取这个节点的属性
	public Person getPerson(){
		return this.person;
	}
	
	//获取这个节点的下一个节点
	public PersonChainNode getNextNode(){
		return this.pChain;
	}
	
	//设置这个节点的下一个节点
	public void setNextNode(PersonChainNode pcn){
		this.pChain=pcn;
	}
	
	//定义构造方法
	public PersonChainNode(Person p,PersonChainNode pc){
		this.person=p;
		this.pChain=pc;
	}
	
	public PersonChainNode(Person p){
		this.person=p;
	}
}
这里面数据域存储的是一个Person实体,自定义的,实际使用中可以任意存储什么东西都可以的。

Person实体:Person.java

//Person实体的定义
public class Person {
	private String name;// 姓名
	private int age; // 年龄
	private int personNo;// 编号,用作唯一标识
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getPersonNo() {
		return personNo;
	}
	public void setPersonNo(int personNo) {
		this.personNo = personNo;
	}
}
单链表类:PersonChain.java
//定义一个单链表,一个单链表包括头节点和节点数量
public class PersonChain {
	private PersonChainNode head;//头节点
	private int chainSize;//链表大小,即节点数量
	
	public int getSize(){
		return this.chainSize;
	}
	
	public PersonChainNode getHead(){
		return this.head;
	}
	
	//添加节点,头部插入
	public void addNode(Person p){
		if(head!=null){//如果有头节点,添加新的头节点,取代之前头节点(头插法)
			head = new PersonChainNode(p,head);
			chainSize ++;		
		}
		else{//如果没有头节点,直接添加一个新节点
			head = new PersonChainNode(p);
			chainSize ++;
		}
	}
	
	//添加节点,从第index位置插入
	public void addNodeIndex(Person p,int index){
		if(index==0){//如果从0位置插入,即从头部插入
			addNode(p);
		}
		else{
			if(index>chainSize){//index位置超出链表容量
				System.out.println("超出链表最大的节点数:"+chainSize+",请重新输入要插入的索引位置。");
			}
			else{
				int count=0;
				for(PersonChainNode pcn=head;pcn!=null;pcn=pcn.getNextNode()){//遍历链表
					count++;
					if(count==index){//找到index位置的节点,这时候的pcn是这个节点的前一个节点
						PersonChainNode pcn1 = new PersonChainNode(p,pcn.getNextNode());//新节点pcn1的下一个节点是pcn节点的下一个节点
						pcn.setNextNode(pcn1);//pcn的下一个节点变成新的节点pcn1
					}
				}
			}
		}
		
	}
	
	//删除节点
	public void deleteNode(int index){
		if (index > chainSize - 1) {//超出链表容量
			System.out.println("超出链表最大的节点数:" + chainSize + ",请重新输入要删除的索引位置。");
		}
		else {
			if (index == 0) {//删除头节点的话
				head = head.getNextNode();//直接把头节点的下一个节点变成头节点
				chainSize = chainSize - 1;
			} else {
				if (index == chainSize - 1) {//如果是删除最后一个节点
					int count = 0;
					for (PersonChainNode pcn = head; pcn != null; pcn = pcn.getNextNode()) {
						count++;
						if (count == index) {
							pcn.setNextNode(null);//将倒数第二个节点,的下一个节点设置为空
						}
					}
				} else {//删除中间节点
					int count = 0;
					for (PersonChainNode pcn = head; pcn != null; pcn = pcn.getNextNode()) {
						count++;
						if (count == index) {
							pcn.setNextNode(pcn.getNextNode().getNextNode());
							// pcn.getNextNode().setNextNode(null);
						}
					}
				}
			}
		}	
	}
}
测试链表的使用,这时候我们已经可以从链表中插入和删除数据了:LinkListTest.java
public class LinkListTest {
	public static void main(String[] args) {
		//第一个节点的属性Person
		Person p1 = new Person();
		p1.setAge(10);
		p1.setName("p1");
		p1.setPersonNo(123);

		// 第二个节点的属性Person
		Person p2 = new Person();
		p2.setAge(11);
		p2.setName("p2");
		p2.setPersonNo(456);

		// 第三个节点的属性Person
		Person p3 = new Person();
		p3.setAge(12);
		p3.setName("p3");
		p3.setPersonNo(789);
		
		// 在index位置插入节点的属性Person
		Person p4 = new Person();
		p4.setAge(13);
		p4.setName("p4");
		p4.setPersonNo(139);
		
		//实例化一个单链表
		PersonChain pc = new PersonChain();
		pc.addNode(p1);
		pc.addNode(p2);
		pc.addNode(p3);
		
		//在第2个位置插入节点
		pc.addNodeIndex(p4, 1);
		
		//删除节点
		pc.deleteNode(2);
		
		System.out.println(pc.getHead().getPerson().getName());//头节点的 属性Person名称
		System.out.println(pc.getHead().getNextNode().getPerson().getName());//头节点的 下一个节点属性Person名称	
		System.out.println(pc.getHead().getNextNode().getNextNode().getPerson().getName());
		//System.out.println(pc.getHead().getNextNode().getNextNode().getNextNode().getPerson().getName());
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值