1. 程式人生 > >lintcode 連結串列倒數第n個節點

lintcode 連結串列倒數第n個節點

lintcode 連結串列倒數第n個節點

每日一練 加油

描述

找到單鏈表倒數第n個節點,保證連結串列中節點的最少數量為n。

樣例

給出連結串列 3->2->1->5->null和n = 2,返回倒數第二個節點的值1.

思路

第一個反應,先檢索出連結串列的長度Num,然後倒數第n個就是正數第Num-n+1個,就可以解決了,這樣要遍歷整個連結串列一次再遍歷到第Num-n+1個位置,指標一共移動了 Num-1+Num-n+1-1 = 2*Num - n-1次。

/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
class Solution {
public:
    /*
     * @param head: The first node of linked list.
     * @param n: An integer
     * @return: Nth to last node of a singly linked list. 
     */
    ListNode * nthToLast(ListNode * head, int n) {
        // write your code here
        ListNode *cur = head;
        int Num = 0;
        while(cur) {
            Num++;
            cur = cur->next;
        }
        cur = head;
        while(Num-n) {
            cur = cur->next;
            Num--;
        }
        return cur;
    }
};

如果使用兩個指標 cur和pre,先將pre往後移動n-1次,然後cur和pre一起向後移動,知道pre是最後一個節點,那麼cur就是倒數第n個,因為最後一個節點和倒數第n個節點的位置差為n-1。可以計算出,兩個指標一共移動了也是2*Num-n-1次。


/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
class Solution {
public:
    /*
     * @param head: The first node of linked list.
     * @param n: An integer
     * @return: Nth to last node of a singly linked list. 
     */
    ListNode * nthToLast(ListNode * head, int n) {
        // write your code here
        if (!head)
            return NULL;
        ListNode *cur = head,
                 *pre = head;
        int step = n-1;
        while(step) {
            pre = pre->next;
            step--;
        }
        while(pre->next) {
            cur = cur->next;
            pre = pre->next;
        }
        return cur;
    }
};

單從指標的移動次數來講其實是沒有差別的,但是執行之後可以看出下面的程式碼執行的速度更快一點,個人分析來判斷,是因為第一種方法的Num計數 再迴圈種和指標移動次數一樣,而第二種只需要n-1次。

第二種方法中使用兩個指標的思想需要記住。