java新浪面试题.求单链表中倒数第k个节点和单链表节点个数

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);
}
}

测试结果为

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我有一计,,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值