C语言面试题22. 链表中倒数第k个节点

要求:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

思路:定义快慢双指针,先让快指针先走k步,然后双指针一起移动,完成只需要遍历一遍

struct ListNode* getKthFromEnd(struct ListNode* phead, int k){
    struct ListNode* pfast = phead ;
    struct ListNode* pslow= phead ;
    while(k--)
    {
        pfast=pfast->next ;

    }
    while(pfast!=NULL)
    {
        pslow=pslow->next;
        pfast =pfast->next;
    }
    return pslow ;
}
BTW 下面顺提一下我一开始的麻烦做法虽然也通过了不过是真的蠢 - -
先反转 然后找到反转的节点,接着再反转@@ 哈哈。还是要熟练运用快慢指针呀

struct ListNode* curr =phead ;
struct ListNode* temp =NULL ;
struct ListNode* p =NULL ;
//反转链表
while(curr!=NULL)
{
temp = curr->next ;
curr->next =prev ;
prev = curr ;
curr = temp ;
}
//找到倒数k的节点
phead = prev ;
p=phead;
while(len != k)
{
p=p->next ;
len++ ;
}
curr = phead ;
prev =NULL ;

//继续反转

while(prev!=p)
{
temp =curr->next;
curr->next =prev ;
prev = curr ;
curr =temp ;
}
return prev ;

 

猜你喜欢

转载自www.cnblogs.com/cocobear9/p/12301923.html
今日推荐