【新浪面试题】如何技高一筹解决查找单链表中的倒数第k个结点

解决方法:

使用快慢指针,慢指针先不动,快指针先走k-1步,然后两个指针一起以同样的速度走。当快指针到达终点时,慢指针正好停留在倒数第k-1个节点。因为它们之间的距离始终保持k-1。

代码如下:
package com.guigu.LinkedListDemo;

public class SpeedAndSlow {
	public static void main(String[] args) {
		// 创建一个单链表
		LinkedList list = new LinkedList();
		
		HNode hNode1 = new HNode(1, "tom");
		HNode hNode2 = new HNode(2, "jack");
		HNode hNode3 = new HNode(3, "simth");
		HNode hNode4 = new HNode(4, "cls");
		
		list.add(hNode1);
		list.add(hNode2);
		list.add(hNode3);
		list.add(hNode4);
		// 遍历链表
		list.list();
		
		System.out.println();

		int k = 3;
		HNode lock = getBackwardsK(list, k);
		System.out.printf("倒数第%d个节点是%s", k, lock.name);
	}
	
	public static HNode getBackwardsK(LinkedList list, int k) {
		HNode speed = list.head; // 定义一个快指针,初始化为head
		HNode slow = list.head; // 定义一个慢指针,初始化为head
		// 当快指针走到链表尾的时候退出
		while(speed.next != null) {
			if(--k > 0) { // 让快指针先走k-1步
				speed = speed.next;
			}else {
				// 快指针和慢指针一起走
				speed = speed.next;
				slow = slow.next;
			}
		}
		// 此时慢指针所在的位置就是倒数第k个节点
		if(k > 0) {
			return null;
		}
		return slow;
	}
}

运行结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值