每日一题
链表中倒数最后k个节点
思路
思路一:由于单链表不能逆序遍历,因此我们可以先从头到尾遍历一次链表,求出链表的长度length,最后再从头到尾遍历一次链表,到第length - k + 1个节点时,即到达倒数第k个节点,返回这个节点即可。
思路二:双指针法。我们可以定义快慢指针,并使其之间的距离为k,这样当快指针走到链表尾时,慢指针恰好停在了倒数第k个节点。
实现代码
思路一
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
int length = 0; //定义链表长度
int address; //定义倒数第k个节点的位置
int count = 1;
struct ListNode *tail = pHead;
while(tail)
{
length++;
tail = tail->next; //计算长度
}
tail = pHead;
if(k > length) //如果k大于length,则说明链表长度不够,直接返回NULL
return NULL;
address = length - k + 1; //确定倒数第k个节点的位置
while(count < address)
{
tail = tail->next; //得到倒数第k个节点的位置
count++;
}
return tail; //返回倒数第k个节点
}
思路二
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
int count=0;
struct ListNode *fast, *slow;
fast = slow = pHead;
while(1) //先让快指针比慢指针快k个节点
{
count++;
if(!fast) //如果fast已经为NULL即已经走到表尾,count仍不等于k,说明k大于表长,直接返回NULL
return NULL;
fast = fast->next;
if(count == k)
break;
}
while(fast) //当fast不为空,即没有走到表尾
{
fast = fast->next; //快慢指针同时走一个节点
slow = slow->next;
}
return slow;
}