输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
解题思路
将倒数转换成正数
- 首先计算链表的长度:size
- 最后计算正数多少个数到达 倒数第K个节点
- 将当前节点回位到头结点,移动相应的步数
- 返回当前节点
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int size = 0;
ListNode curNode = head;
while (curNode != null){
size++;
curNode = curNode.next;
}
int num = size-k;
curNode = head;
while (num > 0){
curNode = curNode.next;
num--;
}
return curNode;
}
}
第二种题解(不好想)
先让临时指针先移动 倒数k - 1 步。
然后对临时指针所处位置进行循环判断。只有临时指针不为空,另一个指针随临时指针一起移动。
代码如下
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(k<0 || head==null){
return null;
}
ListNode pTemp = head,pNode = null;
for(int i=0;i<k-1;i++){
pTemp = pTemp.next;
}
while(pTemp != null){
if(pNode==null){
pNode = head;
}else{
pNode = pNode.next;
}
pTemp = pTemp.next;
}
if(pNode!=null){
return pNode;
}
return null;
}
}