先遍历一遍链表,得到总的结点数,再找到倒数第k个几点就对应数值即可。边界条件为0.
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(k == 0)
return null;
int count = 0;
ListNode p = head;
while(p != null){
p = p.next;
count++;
}
int t = count - k;
p = head;
ListNode pre = null;
while(p != null && t >= 0){
pre = p;
p = p.next;
t--;
}
return pre;
}
}
在写代码的时候有个小错误:在第二个while循环体中没有写pre = p;
这个条件,直接返回的p,结果肯定是null啊!
2、上面的方法使用了两次循环,如果要求使用一次遍历就得到了结果!
使用快慢指针,开始的时候都指向头结点,注意这里的头结点就是包含数据的第一个结点。然后让快指针先移动一段距离,使得两个指针的差距为k-1,即从当时的快指针位置向慢指针查第k个位置正好是慢指针。然后让两个指针一块向后移动,当快指针指向最后一个元素的时候,慢指针指向的就是倒数第k个元素!利用的是两指针之间的距离不变!代码如下:
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode fast = head;
ListNode slow = head;
if(head == null || k<=0){
return null;
}
for(int i=0;i<k-1;i++){
if(fast.next != null){
fast = fast.next;
}else
return null;
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
参考:https://www.cnblogs.com/mthoutai/p/6872784.html
本来想着链表倒序一下,直接输出第k个,但是发现不对,因为结果带着方向呢!比如说:{1,2,3,4,5},k=3,输出的是{3,4,5},而不是结点值!
正好总结一下倒置链表的算法:
public void reverse(ListNode head,int k) {
ListNode pre = null;
while(head != null){
ListNode t = head.next;//先存储下一位的值
head.next = pre;//指针逆转
pre = head;//先变换pre的值
head = t;//后变换head的值
}
}