剑指Offer 面试题22:链表中倒数第k个节点 Java代码实现

原创 2017年11月26日 13:28:27

题目 输入一个链表,输出该链表中倒数第k个结点。

这个问题可以用两个链表指针来实现,这个方法在单向链表的问题中经常使用。具体而言,就是一快一慢两个指针,快指针先走(k-1)步,然后两个指针同时走,当快指针到达链表尾部的时候,慢指针就指向倒数第k个节点。当然移动过程中,还需要判断链表是否存在倒数第k个节点。我们约定链表尾部是倒数第一个节点。


private class ListNode{
		int value;
		ListNode next;
	}
	
	//约定链表末尾为倒数第一个
	public static ListNode findKthToTail(ListNode head,int k){
		if(head==null||head.next==null||k<1){
			return null;
		}
		
		//个人习惯使用有头结点head的链表,head.next才是第一个数据节点
		//两个指针都指向第一个数据节点
		ListNode pFast=head.next;
		ListNode pBehind=head.next;
		
		//快指针先走(k-1)步,即两个指针相差(k-1)
		//移动过程中需要判断是否为空,因为链表大小可能小于k
		for(int i=0;i<k;i++){
			if(pFast.next!=null){
				pFast=pFast.next;
			}else{
				//链表没有倒数第k个节点
				return null;
			}
		}

		//然后两个指针同时后移,直到快指针到达链表尾部(倒数第1个)
		//此时慢指针就指向倒数第k个
		while(pFast.next!=null){
			pFast=pFast.next;
			pBehind=pBehind.next;
		}
		
		return pBehind;
	}private class ListNode{
		int value;
		ListNode next;
	}
	
	//约定链表末尾为倒数第一个
	public static ListNode findKthToTail(ListNode head,int k){
		if(head==null||head.next==null||k<1){
			return null;
		}
		
		//个人习惯使用有头结点head的链表,head.next才是第一个数据节点
		//两个指针都指向第一个数据节点
		ListNode pFast=head.next;
		ListNode pBehind=head.next;
		
		//快指针先走(k-1)步,即两个指针相差(k-1)
		//移动过程中需要判断是否为空,因为链表大小可能小于k
		for(int i=0;i<k;i++){
			if(pFast.next!=null){
				pFast=pFast.next;
			}else{
				//链表没有倒数第k个节点
				return null;
			}
		}

		//然后两个指针同时后移,直到快指针到达链表尾部(倒数第1个)
		//此时慢指针就指向倒数第k个
		while(pFast.next!=null){
			pFast=pFast.next;
			pBehind=pBehind.next;
		}
		
		return pBehind;
	}


版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指offer--面试题22:链表中倒数第k个节点

#include #include typedef struct node { int data; struct node *next; }Node,*Link...

【剑指offer】面试题22:链表中的倒数第k个节点

题目输入一个链表,输出该链表中倒数第k个节点。 为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有6个节点,从头结点开始,它们的值以此是1、2、3、4、5...

剑指Offer 面试题23:链表中环的入口节点 Java代码实现

题目描述 一个链表中包含环,请找出该链表的环的入口结点。 这题又用到了一快一慢两个指针的方法,快指针一次走两步慢指针一次走一步。可以证明,若存在环路,则这两个指针一定会在环路中某个地方相遇。这也是检...

剑指offer 面试题15—链表中倒数第k个节点

基本思想: 解法一:O(n^2) 先算出链表的长度n,然后倒数第k个结点就是顺序的第(n-k+1)个数,不过这样需要2次遍历链表,第一次统计出链表中节点的个数n,第二次就能找到倒数第k个节点。 ...

剑指offer面试题15-链表中倒数第k个节点

题目: 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如一个链表有6个节点,从头结点开始他们的值依次是1、2、3、4、5、6,...

剑指Offer 面试题18:删除链表节点 Java代码实现

题目:在O(1)时间内删除链表节点。 给定单向链表头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。 这儿采用有头结点的单链表结构,头结点的存在是为了方便操作,针对单链表来说,如果带头...

剑指Offer:面试题15——链表中倒数第k个结点(java实现)

问题描述 输入一个链表,输出该链表中倒数第k个结点。(尾结点是倒数第一个) 结点定义如下:public class ListNode { int val; ListNode nex...

剑指Offer 面试题24:反转链表 Java代码实现

题目:定义一函数,输入链表的头结点,反转该链表并输出反转后的链表头结点。 因为在反转一个节点时,需要把该节点的指针域指向其前一节点,这样就无法访问其后续节点。所以,需要有三个指针分别指向当前节点...

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点。  为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。  例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4...

【剑指offer】面试题15 使用一次遍历查找到倒数第K个节点-java

节点代码和链表定义代码参加 Java单链表操作 【要求】  单次遍历即返回实验结果 【解题思路】 使用两个指针 *p1 和p2=*(p1+k-1), 当p2变为尾节点时候,p1即为所需要的倒数第K个节...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer 面试题22:链表中倒数第k个节点 Java代码实现
举报原因:
原因补充:

(最多只允许输入30个字)