输入一个链表,输出该链表中倒数第k个结点。

来源:互联网 发布:淘宝快捷支付怎么开通 编辑:程序博客网 时间:2024/06/08 16:04

1,问题:

输入一个链表,输出该链表中倒数第k个结点。

2,想法都在代码里标注了:

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public:    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {        //思路1:先扫描链表,得到规模,再顺序扫描到指定位置        //缺点:扫描较多        /*if (pListHead == NULL || k <= 0)        {            return NULL;        }        int count = 0;        ListNode* temp = pListHead;        while (pListHead)        {            count++;            pListHead = pListHead->next;        }        int m = count - k;        //倒数第k个,是顺数第count - k +1个        if (m < 0)         {            return NULL;        }        else        {            while (m > 0)            {                temp = temp->next;                m--;            }            return temp;        }        */        //思路2:倒数第k个位置,是顺数第n-k+1个位置        //设两个指针都指向头结点,那么第一个指针走k-1步到达顺数第k位置        //然后第二个指针和第一个指针一起走n-k步,即访问完链表,就到达了        //n-k+1位置,即倒数第k位置        if(pListHead == NULL || k <= 0)        {            return NULL;        }        ListNode* temp1 = pListHead;        ListNode* temp2 = pListHead;        //下边for循环的意思:        //若i满足for循环条件,表示还要往下走        //但是temp1->next如果等于空,就说明下边没有节点了,        //说明k比链表长度大,返回空        //否则就往下走到顺数k位置        for (int i =1; i < k; i++)        {            if (temp1->next == NULL)            {                return NULL;            }            else                temp1 = temp1->next;        }        //上面若没有return,即走到了顺数k位置        //那么我再用下边这个while循环,走到        //倒数k位置,即顺数n-k+1位置即可        while (temp1->next)        {            temp2 = temp2->next;            temp1 = temp1->next;        }        return temp2;    }};


1 0
原创粉丝点击