求链表中倒数第k个结点-Java实现

/*
需求:求链表中倒数第k个结点
思路:需要有两个指针,第一个指针先走k-1步,然后两个指针一起走
		当第一个指针走到链表结尾时,第二个指针到达倒数第k个结点

解法:
1,Java如何定义链表?
	链表是一个类,属性包括头结点和结点总数(此处必须考虑这个属性,因为需要跟k比较)
	每个结点又是一个类,属性包括数据域和指向下一个结点的引用
2,创建一个链表
3,求倒数第k个结点
*/

//结点类
class Nod
{
	public int data;//定义结点数据域
	public Nod next=null;//定义指向下一个结点的引用

	public Nod(int data)
	{
		this.data=data;
	}
}

//链表类
class LinkList
{
	public Nod head=null;//初始化链表头结点为空
	private int nodeCount;//定义链表结点总数

	//增加结点
	public void addNod(int d)
	{
		Nod newNode=new Nod(d);

		//若头结点为空,则让新增加的结点作为头结点
		if (head==null)
		{
			head=newNode;
			nodeCount++;
			return;
		}

		//头结点不为空时,找到链表最后一个结点,在其后增加新节点
		Nod temp=head;
		while (temp.next!=null)
		{
			temp=temp.next;
		}
		temp.next=newNode;
		nodeCount++;
	}

	//获取链表结点总数
	public int getCount()
	{
		return nodeCount;
	}
}

class  FindKthToTail
{
	public static Nod findKthToTail(int k)
	{
		if (k==0)
		{
			System.out.println("k不能为0!");
			return null;
		}

		//创建链表
		LinkList ll=new LinkList();
		ll.addNod(1);
		ll.addNod(2);
		ll.addNod(3);
		ll.addNod(4);
		ll.addNod(5);
		ll.addNod(6);
		
		int count=ll.getCount();

		//判断链表是否为空
		if (count==0)
		{
			System.out.println("链表为空!");
			return null;
		}

		//判断链表结点总数和k的关系
		if (k>count)
		{
			System.out.println("k大于链表结点总数!");
			return null;
		}
		
		//第一个引用先走k-1步
		Nod p1=ll.head;
		for (int i=0;i<k-1 ;i++ )
		{
			p1=p1.next;
		}

		//两个引用一起走,知道第一个引用走到链表末尾
		Nod p2=ll.head;
		while (p1.next!=null)
		{
			p1=p1.next;
			p2=p2.next;
		}

		return p2;
	}
		
	public static void main(String[] args) 
	{
		Nod k=findKthToTail(0);
		System.out.println("data:"+k.data);
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值