lintcode 連結串列倒數第n個節點
阿新 • • 發佈:2018-11-22
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次。
第二種方法中使用兩個指標的思想需要記住。