zoukankan      html  css  js  c++  java
  • 9.链表中倒数第k个结点[FindReverseKthLinkedListNode]

    题目】

    输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:

     C++ Code 
    1
    2
    3
    4
    5
     
    struct ListNode
    {
        
    int       m_nKey;
        ListNode *m_pNext;
    };

    【分析】

    为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。

    既然不能从尾结点开始遍历这个链表,我们还是把思路回到头结点上来。假设整个链表有n个结点,那么倒数第k个结点是从头结点开始的第n-k-1个结点(从0开始计数)。如果我们能够得到链表中结点的个数n,那我们只要从头结点开始往后走n-k-1步就可以了。如何得到结点数n?这个不难,只需要从头开始遍历链表,每经过一个结点,计数器加一就行了。这种思路的时间复杂度是O(n),但需要遍历链表两次。第一次得到链表中结点个数n,第二次得到从头结点开始的第n-k-1个结点即倒数第k个结点。

    如果链表的结点数不多,这是一种很好的方法。但如果输入的链表的结点个数很多,有可能不能一次性把整个链表都从硬盘读入物理内存,那么遍历两遍意味着一个结点需要两次从硬盘读入到物理内存。我们知道把数据从硬盘读入到内存是非常耗时间的操作。我们能不能把链表遍历的次数减少到1?如果可以,将能有效地提高代码执行的时间效率。

    如果我们在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针保持不动;在第k-1步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。

    这种思路只需要遍历链表一次。对于很长的链表,只需要把每个结点从硬盘导入到内存一次。因此这一方法的时间效率前面的方法要高。

    思路一的参考代码:

    【代码1】

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    ///////////////////////////////////////////////////////////////////////
    // Find the kth node from the tail of a list
    // Input: pListHead - the head of list
    //        k         - the distance to the tail
    // Output: the kth node from the tail of a list
    ///////////////////////////////////////////////////////////////////////
    ListNode *FindKthToTail_Solution1(ListNode *pListHead, unsigned int k)
    {
        
    if(pListHead == NULL)
            
    return NULL;

        
    // count the nodes number in the list
        ListNode *pCur = pListHead;
        
    unsigned int nNum = 0;
        
    while(pCur->m_pNext != NULL)
        {
            pCur = pCur->m_pNext;
            nNum ++;
        }

        
    // if the number of nodes in the list is less than k
        // do nothing
        if(nNum < k)
            
    return NULL;

        
    // the kth node from the tail of a list
        // is the (n - k)th node from the head
        pCur = pListHead;
        
    for(unsigned int i = 0; i < nNum - k; ++ i)
            pCur = pCur->m_pNext;

        
    return pCur;
    }

    思路二的参考代码:

    【代码2】

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    ///////////////////////////////////////////////////////////////////////
    // Find the kth node from the tail of a list
    // Input: pListHead - the head of list
    //        k         - the distance to the tail
    // Output: the kth node from the tail of a list
    ///////////////////////////////////////////////////////////////////////
    ListNode *FindKthToTail_Solution1(ListNode *pListHead, unsigned int k)
    {
        
    if(pListHead == NULL)
            
    return NULL;

        
    // count the nodes number in the list
        ListNode *pCur = pListHead;
        
    unsigned int nNum = 0;
        
    while(pCur->m_pNext != NULL)
        {
            pCur = pCur->m_pNext;
            nNum ++;
        }

        
    // if the number of nodes in the list is less than k
        // do nothing
        if(nNum < k)
            
    return NULL;

        
    // the kth node from the tail of a list
        // is the (n - k)th node from the head
        pCur = pListHead;
        
    for(unsigned int i = 0; i < nNum - k; ++ i)
            pCur = pCur->m_pNext;

        
    return pCur;
    }

     【参考】

    http://zhedahht.blog.163.com/blog/static/2541117420072114478828/

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    Educational Codeforces Round 20 D. Magazine Ad
    Educational Codeforces Round 20 C. Maximal GCD
    紫书第三章训练2 暴力集
    Educational Codeforces Round 20 B. Distances to Zero
    Educational Codeforces Round 20 A. Maximal Binary Matrix
    紫书第三章训练1 D
    紫书第一章训练1 D -Message Decoding
    HAZU校赛 Problem K: Deadline
    Mutual Training for Wannafly Union #8 D
    紫书第三章训练1 E
  • 原文地址:https://www.cnblogs.com/hellogiser/p/3738503.html
Copyright © 2011-2022 走看看