题目:输入一个链表,输出该链表中倒数第k个结点。
思路:
要找链表中倒数第k个节点,我们自然会首先想到,先求出整个链表的长度L,得到d=L - k ;那么我们只需要找到第d个节点就可以了;代码较简单,自己尝试写就可以了。
另一种方法就是定义一个slow节点和一个fast节点,要找链表中倒数第k个节点,那么就让fast先走k - 1个节点,再让slow和fast同时走,当fast走到终点时,slow所在的位置就是题目中所求的倒数第k个节点。下面的这幅图画就是描述的这个思想。当你能把下面这幅思维逻辑图能够很好的理解时,那么下面的代码也 就很好理解了。
方法一
程序如下:
public ListNode findKthToTail1(int k){
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(k <=0 ||k > getLength(head)) {
return null;
//判断k是否合理
}
ListNode fast = head;
ListNode slow = head;
while(k-1>0) {
fast = fast.next;
k--;
}
while(fast.next != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
public int getLength(ListNode head) {
int count = 0;
ListNode cur = head;
while(cur!= null) {
count++;
cur = cur.next;
}
return count;
}
}
}
但是这段代码若想运行成功,还需要你单独写一个getLength()函数,不是很方便。
方法二
其实这个方法与方法一大同小异(思维逻辑图同上),较上一段代码优化了一下,省去了写getLength()函数,但需要在while里面增加一个if函数来限制一下,且只需遍历单链表一遍,我们来看一下:
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(k <=0||head == null ) {
return null;
}
ListNode fast = head;
ListNode slow = head;
while(k-1>0) {
if(fast.next != null){
fast = fast.next;
k--;
}else {
System.out.println("没有这个节点");
return null;
}
}
while(fast.next != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}