题解 | #链表中倒数最后k个结点#

链表中倒数最后k个结点

http://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9

方法一:栈辅助
题目要求的是倒数第k个结点,以后后面的所有节点,那我们就可以把链表的所有元素全部放入栈中,然后依次弹出k-1个,此时栈顶的结点就是第k个结点;
思路大致如下:
(1)创建栈,遍历链表,依次把链表元素入栈;
(2)栈中再依次弹出k-1个元素;
(3)返回栈顶元素
注意:如果给定的k大于了栈的长度,说明找不到这个元素,返回空指针

    if(pHead == nullptr) return nullptr;
    ListNode* p = new ListNode(-1);
    p = pHead;
    stack<ListNode*> s;
    while(p)
    {
        s.push(p);
        p = p->next;
    }
    if(k > s.size() || k == 0) return nullptr;//超出了栈的长度,找不到
    for(int i = 1;i < k;i ++)
    {
        s.pop();
    }
    return s.top();

方法二:快慢指针
定义两个指针,分别给其命名为快慢指针,且都将头节点赋给两个指针,然后让快指针先走k个结点,这样两个指针的距离就是k了,最后两个指针分别往后走,当快指针走到头了,慢指针就到了倒数第k个结点了;
思路如下:
(1)定义两个快慢指针,并将头节点赋给它们
(2)让快指针先走k个结点,使两个指针保持距离为k
(3)两个指针同时往后走,当快指针走到头了,慢指针就到了倒数第k个结点了
(4)返回慢指针

        if(pHead == nullptr) return nullptr;
        ListNode* faster = pHead;
        ListNode* slower = pHead;
        for(int i = 0;i < k;i++)
        {
            if(faster == nullptr) return nullptr;
            faster = faster->next;
        }
        while(faster != nullptr)
        {
            faster = faster->next;
            slower = slower->next;
        }
        return slower;
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务