閱讀521 返回首頁    go 技術社區[雲棲]


CareerCup之2.2 尋找單鏈表倒數第n個元素

【題目】

原文:

2.2 Implement an algorithm to find the nth to last element of a singly linked list.

譯文:

實現一個算法從一個單鏈表中返回倒數第n個元素。

【分析】

(1)創建兩個指針p1和p2,指向單鏈表的開始節點。

(2)使p2移動n-1個位置,使之指向從頭開始的第n個節點。(意思是就是使p1和p2距離n個位置)

(3)接下來檢查p2 - > = = null 如果yes返回p1的值,否則繼續移動p1和 p2 如果接下來p2為null意味著p1指向從結尾開始計算的第n個節點。

(4)重複第三步

【代碼】

/*********************************
*   日期:2014-5-18
*   作者:SJF0115
*   題目: 尋找單鏈表倒數第n個元素
*   來源:CareerCup
**********************************/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* nthToLast(ListNode* head,int n){
    //head 帶有頭結點的單鏈表
    if(head->next == NULL || head == NULL || n <= 0){
        return NULL;
    }
    int i;
    ListNode* p1 = head->next;
    ListNode* p2 = head->next;
    //p2移動n-1個位置
    for(i = 1;i <= n-1;i++){
        //總共元素不到n個
        if(p2 == NULL){
            return NULL;
        }
        p2 = p2->next;
    }
    //p2移動至末尾則p1移動到倒數第n個元素
    while(p2->next != NULL){
        p1 = p1->next;
        p2 = p2->next;
    }
    return p1;
}

int main(){
    int i,j;
    //freopen("C:\\Users\\XIAOSI\\Desktop\\acm.txt","r",stdin);
    ListNode *head = (ListNode*)malloc(sizeof(ListNode));
    head->next = NULL;
    ListNode *node;
    ListNode *pre = head;

    int A[] = {6,5,3,3,6,5,6,7,3,7,1,2,1,4,6,7,2,3};

    for(int i = 0;i < 18;i++){
        node = (ListNode*)malloc(sizeof(ListNode));
        node->val = A[i];
        node->next = NULL;
        pre->next = node;
        pre = node;
    }

    node = nthToLast(head,18);
    if(node != NULL){
        cout<<node->val<<endl;
    }
    else{
        cout<<""<<endl;
    }
    return 0;
}



最後更新:2017-04-03 12:56:43

  上一篇:go In-Stream Big Data Processing譯文:流式大數據處理
  下一篇:go cocos2d-x—使用shader使圖片背景透明