单向链表_找出倒数第K个节点

                                                                            实现一个算法,找出单向链表中倒数第K个结点。

解法:

实现这个算法,可以用递归和非递归。因为单向链表只能向后遍历,所以一般会想到用递归这种方法,然后当递归遍历到链表末端时,该方法会回传一个置为0的计数器。

之后的每一次调用都会将这个计数器加1,当计数器等于K时,表示我们访问的是链表倒数第K个元素。

方法A

public static int nToLast(LinkedListNode head,int k){
	if(head==null){
		return 0;
	}
	int i = nToLast(head.next,k)+1;//当遍历到最后一个元素时,计数器i开始自增。</span>
	if(i==k){
		System.out.println(head.data);
	}
	return i;
}
<span style="color:#33cc00;">//但是这个方法只能打印倒数第K个值,不能返回该元素,因为我们无法用一般的返回语句回传一个结点和一个计数器。</span>

方法B:

可以通过引用传值,这样一来,我们就可以返回结点值,而且也能通过传递指针更新计数器。

node* nToLast(node* head,int k,int& i){
	if(head==null){
		return null;
	}
	node* nd = nToLast(head.next,k,i);
	i=i+1;
	if(i==k){
		return head;
	}
	return nd;

}
方法C:

是基于方法B的思想,用一个简单的类包装计数器值,就可以模仿按引用传值。

public class MyCount
{
	public int value = 0;	
}
LinkedListNode nToLast(LinkedListNode head,int k,MyCount i){
	LinkedListNode node = nToList(head.next,k,i);
	i.value = i.value+1;
	if(i.value == k){
		return head;
	}
	return node;
}

方法D 

迭代法,一个更直接的方法,我们可以使用两个指针p1和p2,并将他们指向链表中相距k个结点的两个结点,具体做法是将p1和p2指向链表首结点,然后将p2向后移动k个结点,之后,我们以相同的速度移动这两个指针,p2会在移动length-k步后抵达链表末尾结点,这时,p1就指向链表倒数第k个结点。

LinkedListNode nToList(LinkedListNode head,int k){
	if(k<=0)
		return null;
	LinkedListNode p1 = head;
	LinkedListNode p2 = head;

	for(int i=0;i<k-1;i++){
		if(p2==null) 
			return null;
		p2 = p2.next;
	}
	if(p2==null)
		return null;
	while(p2.next!=null){
		p1 = p1.next;
		p2 = p2.next;
	}
	return p1;
}


转载于:https://www.cnblogs.com/grkbeyond/p/4147268.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值