题目描述
输入一个链表,输出该链表中倒数第k个结点。
分析:
若链表长度为len,则倒数第k个结点就是正数第(len-k+1)个结点,因此可以先遍历链表一次,求出链表长度,再遍历至(len-k+1)个结点即可。但此做法需要遍历链表两次,可以让p1先走(k-1)个结点,再让p2从头开始,当p1到达链表末尾时,p2所在的位置即为第(len-k+1)个结点,也就是倒数第k个结点。在遍历的时候注意边界,若链表长度小于k-1,则返回null。
C++代码:
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == NULL || k == 0)
return NULL;
ListNode* p1 = pListHead;
ListNode* p2 = pListHead;
for(int i = 0; i < k - 1; i++)
{
if(p1->next != NULL)
p1 = p1->next;
else
return NULL;
}
while(p1->next != NULL)
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
};
Java代码:
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k == 0)
return null;
ListNode p1 = head;
ListNode p2 = head;
for(int i = 0; i < k-1; i++){
if(p1.next != null)
p1 = p1.next;
else
return null;
}
while(p1.next != null){
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}