单链表是线性表的一种表示,一个单链表是一个个节点组成,节点是由数据域和链域两部分组成的,数据域就是这个节点要存储的数据,链域指示的是这个节点的下一个节点。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());
}
}