1.创建节点实体类
以学生信息为例,节点StudentNode
包括学生学号id和姓名
/*
* 节点类
* 单个节点信息
*/
public class StudentNode {
public int id;
public String name;
public StudentNode next;
public StudentNode(int id,String name) {
this.id=id;
this.name=name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
2.创建单链表类,完成相应方法
创建单链表类SingleLinkedList,其的每一个对象都是一个节点
完成单链表的添加节点方法
完成单链表的显示方法
完成单链表求节点个数方法
完成求倒数第k个节点的方法
/*
* 单链表类,创建单链表
* 实现对单链表的各种操作
*/
public class SingleLinkedList {
// 初始化头节点,头节点固定不能更改头节点不存放具体数据
private StudentNode head =new StudentNode(0,"");
/*
* 尾插法在链表中插入节点
*/
public void add(StudentNode studentNode) {
//head头节点不能移动,定义辅助变量(指针)指向head,temp可以移动
StudentNode temp=head;
//遍历寻找表尾
while(true) {
if(temp.next==null) {
break;
}
temp=temp.next;
}
//当循环退出,temp指向原链表的表尾节点
//完成新节点的添加
temp.next=studentNode;
}
/*
* 遍历显示链表
*/
public void list() {
//先判断链表是否为空
if(head.next==null) {
System.out.println("该链表为空");
return;
}
//创建辅助指针temp
StudentNode temp=head.next;
//循环输出单链表节点信息
while(true) {
//循环退出条件
if(temp==null) {
break;
}
System.out.println(temp.id+"/t"+temp.name);
//指针后移
temp=temp.next;
}
}
/*
* 1.求节点个数
*/
public void number(SingleLinkedList singleLinkedList1) {
if(head.next==null) {
System.out.println("链表为空");
return;
}
int count=0; //计数器
//创建辅助指针temp
StudentNode temp=head;
while(true) {
if(temp==null) {
break;
}
temp=temp.next;
count++;
}
System.out.println("节点个数为:"+count);
}
/*
* 2.查找倒数第k个节点
* 倒数第k个就是正数第count-k个
*/
public void reciprocalK(int k) {
//先得到所有节点个数
if(head.next==null) {
System.out.println("链表为空");
return;
}
int count=0; //计数器
//创建辅助指针temp
StudentNode temp=head.next;
while(true) {
if(temp==null) {
break;
}
temp=temp.next;
count++;
}
//如果不存在该节点
if(k>count) {
System.out.println("不存在倒数第k个节点");
return;
}
//该节点存在
//再次创建辅助指针temp1
StudentNode temp1=head.next;
for(int i=0;i<count-k;i++) {
temp1=temp1.next;
}
System.out.printf("倒数第%d个节点信息为:",k);
System.out.println(temp1.id+"/t"+temp1.name);
}
}
3.测试类
创建节点,调用前面的尾插法方法将节点逐个插入单链表
继续调用方法完成单链表节点个数和倒数第k个信息的求取
/*
* 测试类
*/
public class tist {
public static void main(String[] args) {
//创建节点
StudentNode s1=new StudentNode(12345,"张三");
StudentNode s2=new StudentNode(23456,"李四");
StudentNode s3=new StudentNode(34567,"王五");
StudentNode s4=new StudentNode(45678,"赵六");
StudentNode s5=new StudentNode(56789,"孙七");
//创建单链表
SingleLinkedList singleLinkedList1=new SingleLinkedList();
//节点插入链表
singleLinkedList1.add(s1);
singleLinkedList1.add(s2);
singleLinkedList1.add(s3);
singleLinkedList1.add(s4);
singleLinkedList1.add(s5);
//节点个数
singleLinkedList1.number(singleLinkedList1);
//倒数第k个节点信息
singleLinkedList1.reciprocalK(2);
}
}
测试结果为