题目分析:本题难度在于单链表只能从头到尾进行遍历。
第一步: 采用双指针策略。第一个指针 p 先走k-1步,第二个指针 q 位于起始位置。
第二步:然后 p 和 q 同时向后移动,直到 p 走到了末尾,则 q 走到倒数第k个结点。
第三步:返回 q 的值即可。
Java代码:
public class Offer22 {
// 定义内部类
class Node{
int data; // 数据域
Node next; // 指针域
// 默认构造函数,初始化不带数据的头结点。
public Node() {
}
// 构造函数,用于创建结点。
public Node(int data){
this.data = data;
}
}
// 创建单链表
public Node creat(){
Node head = new Node(); // 创建一个不带数据的头结点。
Node x = head; // 备份头结点,用于创建链表。
// 简易创建一个链表
for (int i = 1; i <= 6; i++) {
x.next = new Node(i);
x = x.next;
}
return head;
}
// 输出单链表,输出测试。
public void showList(Node head){
// Node x = head;
Node x = head.next;
while (x!=null){
System.out.print(x.data+" ");
x = x.next;
}
System.out.println();
}
// k 是不大于链表的长度的。
public void solve(Node head, int k){
Node p = head;
Node q = head;
for (int i = 1; i < k; i++) {
p = p.next;
}
while (p.next!=null){
p = p.next;
q = q.next;
}
System.out.println(q.data);
}
public static void main(String[] args) {
Offer22 offer22 = new Offer22();
Node list1 = offer22.creat();
System.out.println("链表:");
offer22.showList(list1);
System.out.println("倒数第3个结点的值为:");
offer22.solve(list1,3);
}
}
【注】: leetcode 等平台只要我们完成一个函数即可,本人初出茅庐,为了巩固基本知识,故自己补充了部分代码,用于练手。此代码没有考虑很多边界条件,存在缺陷。