题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路:
首先得对输入值进行判断是否合法,错误输入有2种:
1. 输入链表为空,k不是正数,
2. k值大于链表长度,返回“倒数第k个结点”已经没有意义了。
解法1: 倒数第k个,正着数应该是:第length-k+1个,按顺序输出
解法2: 使用2个指针,前面的先走k步,然后两指针一起走,
当前面当指针指向链表尾部为null时,后面当指针指向的就是倒数第k个结点了。
本题的难点主要在 划分边界 和 判断指针位置 上。
解法1:
package com.xxxx;
/**
* create by ziqiiii
*/
public class Example {
static public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
static public void main(String[] args){
ListNode head = new ListNode(1);
ListNode p = head;
for(int i =2;i<6;i++){
ListNode ele = new ListNode(i);
p.next =ele;
p=p.next;
}
p=head;
while(p!=null){
System.out.println(p.val);
p=p.next;
}
int k = 5;
System.out.println(String.format("=======倒数第%d个值为======",k));
System.out.println(FindKthToTail(head,5).val);
}
static public ListNode FindKthToTail(ListNode head,int k) {
//注意边界
if(head == null || k <= 0){
return null;
}
int length = 0;
ListNode p = head;
while(p!=null){
p = p.next;
length++;
}
int front = length - k +1;
if(front<=0){
return null;
}
ListNode res = head;
//因为head已经是第一个了,所以i从1开始
for(int i =1;i<front;i++){
res = res.next;
}
return res;
}
}
运行结果:
1
2
3
4
5
=======倒数第5个值为======
1
解法2:
static public ListNode FindKthToTail(ListNode head,int k) {
//注意边界
if(head == null || k <= 0){
return null;
}
//设置一个先行指针,指向第k个元素
ListNode prek = head;
for(int i=0;i<k;i++){
prek = prek.next;
if(prek == null && i != k-1){
//当prek已经到链表尾部,但是还没走完for循环,说明k大于链表到长度了
return null;
}
}
ListNode res = head;
while(prek != null){
res = res.next;
prek = prek.next;
}
return res;
}
牛客网运行:
c++更多参考: