跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
Java版剑指offer编程题第14题–链表中倒数第k个结点: 输入一个链表,输出该链表中倒数第k个结点。
我的想法
- 链表结构没有索引,不能像数组那样直接根据get(index)得到你想要的元素,只能用指针遍历链表,找到相等的了,就返回。如果要解决题目中的问题,需要考虑两点:
- 首先,要用一个指针遍历一遍链表,获得链表的总结点数size
- 知道了总节点数,那么倒数第k个结点实际上就是正数第(size-k+1)个结点。也就是说再用一个指针从前往后遍历到第(size-k+1)个结点就行了。
- 等第一个指针走完了,第二个指针再开始行动,有点浪费时间,能否改变第二个指针的时间,使得第一个指针遍历完链表后,第二个指针恰好就走到了倒数第二个节点?
- 很简单呀,第一个指针先走k个节点,第二个指针就开始跟着走,这样当第一个指针遍历完链表后,第二个指针恰好走到倒数第k个节点。
解题方法1
public static List_Node FindKthToTail(List_Node head,int k) {
List_Node p, q;
p = q = head;
int i = 0;
for (; p != null; i++) {
//老二让老大先走k步
if (i >= k)
q = q.next;
p = p.next;
}
//防止参数k超出范围
return i < k ? null : q;
}
代码测试
package com.learnjiawa.jzoffer;
import java.util.ArrayList;
/**
* @author learnjiawa
* 2019-12-13-8:52
*/
public class Solution14 {
public static void main(String[] args) {
List_Node listNode1 = new List_Node(1);
List_Node listNode2 = new List_Node(2);
List_Node listNode3 = new List_Node(3);
List_Node listNode4 = new List_Node(4);
List_Node listNode5 = new List_Node(5);
listNode1.add(listNode2);
listNode2.add(listNode3);
listNode3.add(listNode4);
listNode4.add(listNode5);
List_Node temp = listNode1;
System.out.println("创建链表如下:");
while(temp != null){
System.out.print(temp + " ");
temp = temp.next;
}
System.out.println(" ");
int k = 2;
System.out.println("倒数第"+k+"个阶点是:");
System.out.println(FindKthToTail(listNode1, k));
}
public static List_Node FindKthToTail(List_Node head,int k) {
List_Node p, q;
p = q = head;
int i = 0;
for (; p != null; i++) {
if (i >= k)
q = q.next;
p = p.next;
}
return i < k ? null : q;
}
}
class List_Node {
int val;
List_Node next = null;
List_Node(int val) {
this.val = val;
}
public void add(List_Node listnode){
this.next = listnode;
}
@Override
public String toString() {
return "List_Node{" +
"val=" + val +
'}';
}
}
代码测试控制台输出结果:
总结
链表查找元素的题目,比较简单,其实也可以用空间换时间,将链表每个节点存到数组里面,按索引返回结点值,不过这里给出的节法更好,速度快,并且不会改变节点。
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava: