题目描述:
给定一个单向链表的头结点,找出链表中倒数第k个节点
方法1(求长度):
可以首先遍历链表,求出链表的长度L,再继续从头节点开始遍历一次链表,走到L-K的位置便是所求的节点。这样就要遍历两次链表O(2N);
方法2(递归实现):
递归遍历链表,当达到链表末尾时候,传递一个值为0的计数器,之后每次调用将该计数器加1,当计数器等于k时,便将该节点返回,只需要遍历一次链表,但是需要递归遍历消耗栈空间。
代码实现如下:
BiTree* find1(BiTree* head,int k, int &i)
{
if(head==NULL)
return NULL;
BiTree *nd=find1(head->next,k,i);
++i;
if(i==k)
return head;
return nd;
}
方法3(快慢指针实现):
可以两个移动的指针实现,先让第一个指针遍历k个节点,然后第二个指针从头结点和第一个指针同步移动,当第一个指针达到指针末尾的时候,第二个指针便是倒数第k个节点,这样只需要一次遍历链表,而且空间复杂度为O(1)。
代码实现如下:
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
int count=1;
ListNode* head=pListHead;
if(!pListHead)
return NULL;
while(pListHead->next!=NULL){
count++;
pListHead=pListHead->next;
}
if(count<k)
return NULL;
int i=1;
while(i++<count-k+1){
head=head->next;
}
return head;
}
};