链表中倒数第k个结点
题目描述 题目来源
思路一、 遍历一遍数组求出长度 count 然后再重第一结点往后走count-k个结点就可以找到倒数第k个的结点
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
struct ListNode* tmp=head;
int count=0;
while(tmp)
{
count++;
tmp=tmp->next;
}
count=count-k;
while(count--)
{
head=head->next;
}
return head;
}
思路一需要遍历两遍链表,第一次统计出链表中结点的个数,第二次就能找到倒数第k个结点。但是 现在要把遍历两次变回一次,该如何做? 为了实现只遍历一遍链表就能找到第k个结点,我们可以定义两个指针, 两个指针分别为fast和slow然后两个指针初始化为指向第一个结点,fast指针先走k步,fast走完k步后,fast和slow在同步走每一步,直到fast为NULL,当fast为NULL时,slow刚好指向倒数第k个结点 。 思路二、
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
struct ListNode* fast=head;
struct ListNode* slow=head;
while(k--)
{
fast=fast->next;
}
while(fast!=NULL)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
特殊情况: 1.head为空指针。由于代码会试图访问空指针指向的内存,从而造成程序崩溃。 2.输入k 为零 3.输入k为负数 在原有的基础上我们进行改进
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
if(k==0||head==NULL)
{
return NULL;
}
if(k<0)
{
k=-k;
}
struct ListNode* fast=head;
struct ListNode* slow=head;
while(k--)
{
fast=fast->next;
}
while(fast!=NULL)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
|