美文网首页
2020-04-06:链表中倒数第k个节点

2020-04-06:链表中倒数第k个节点

作者: 再见噜噜班 | 来源:发表于2020-04-06 19:01 被阅读0次

链表中倒数第k个节点

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

来源:力扣(LeetCode)

题解

  • 方法一:常规方法

首先想到的方法是先循环遍历得到链表的长度n,然后再循环n-k次获得倒数第k个节点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    int len=0;
    struct ListNode *ptr = head;
    while(ptr)
    {
        len++;
        ptr=ptr->next;
    }
    int j=len-k;
    while(head && j>0)
    {
        j--;
        head=head->next;
    }
    return head;
}

  • 方法二:双指针

倒数第k个节点,可以理解成距离最后一个节点(这里可以认为是NULL)隔了k个节点。
所以可以用两个相隔k个节点的指针同步移动,当前面的指针移动到尾部时,后面的指针
刚好到距离前面指针k个节点的位置。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    struct ListNode *former=head;
    struct ListNode *latter=head;
    while(former!=NULL)
    {
        former=former->next;
        if(k>0){
            k--;
        }else{
            latter=latter->next;
        }
    }
    return latter;
}

相关文章

网友评论

      本文标题:2020-04-06:链表中倒数第k个节点

      本文链接:https://www.haomeiwen.com/subject/litiphtx.html