• 求单向链表中倒数第k个节点(c++):快慢指针/递归


    题目描述:

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

    题解1:(快慢指针)
    1.定义两个指针,快指针 fast, 慢指针 low .
    2.让 fast先向前移动 k个位置,然后 low 和 fast 再一起向前移动 .
    3.当 fast 到达链表尾部,返回 low .

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* getKthFromEnd(ListNode* head, int k) {
            if(head==NULL)
                return NULL;
            ListNode* fast=head;
            ListNode* low=head;
            
            for(int i=1;i<k;i++)
            {
                fast=fast->next;
            }
            while(fast->next!=NULL)
            {
                fast=fast->next;
                low=low->next;
            }
            return low;
        }
    };

    题解2(递归):

    1.先一直递归到链表尾部,再返回;
    2.定义位置变量 pos ,每次函数返回时 pos++;
    3.当 pos == k时,说明此时递归函数位于第 k 个结点位置,返回该结点;

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        int pos=0;
        ListNode* getKthFromEnd(ListNode* head, int k) {
            if(head==NULL)
                return NULL;
            ListNode* temp=getKthFromEnd(head->next,k);
            pos++;
            if(pos==k)
                return head;///注意
            return temp;///注意
        }
    };
  • 相关阅读:
    HasMap
    SQL Server 2005新特性之使用with关键字解决递归父子关系
    Silverlight4调用本地音频设备并将音频文件上传到服务器
    sql中exists,not exists的用法
    ie中jQuery无法解析xml文件的解决方案
    NeatUpload的安装使用
    C# 中 MSCHART 饼状图显示百分比
    JSON
    silverlight 独立存储
    SharePoint2010 自定义搜索
  • 原文地址:https://www.cnblogs.com/bao-ZhangJiao/p/14268756.html
Copyright © 2020-2023  润新知