链表中倒数第K个节点
题目描述
题目来源:LeetCode-链表中倒数第K个节点
由于在本题中,已经给定了链表不为空,测试用到的K值小于链表长度且不为0,故不需要考虑这些特殊情况
方法一
看到这个题目后,最先想到的方法是进行遍历,第一次遍历求出链表长度Length,第二次遍历(Length-k)+1次即为待求节点
代码如下
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
int count = 1;
struct ListNode *pCount = head;
struct ListNode *pFind = head;
//第一次遍历,求出链表长度
while(pCount->next!=NULL)
{
pCount = pCount->next;
count++;
}
//第二次遍历,找待求位置
for(int i = 1;i < (count-k)+1;i++)
{
pFind = pFind->next;
}
return pFind;
}
方法二
提交之后看到了网上其他的做法发现其实也可以不用测量链表的长度,同样使用快慢指针,定义快指针和慢指针同时指向头节点,快指针第一次走K-1步,然后与慢指针同时向前移动K步,当快指针位于链表尾时,慢指针的位置即为待求位置。
代码如下
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
struct ListNode *pFast = head;
struct ListNode *pSlow = head;
//先移动快指针
for(int i = 0;i<k-1;i++)
{
pFast=pFast->next;
}
//快慢指针一块移动
while(pFast->next!=NULL)
{
pFast=pFast->next;
pSlow=pSlow->next;
}
return pSlow;
}