輸入一個鏈表的頭結點,從尾到頭反到來輸出每個結點的值。

/*
copyright@nciaebupt 轉載請註明出處
題目:輸入一個鏈表的頭結點,從尾到頭反到來輸出每個結點的值。鏈表結點定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:這是一道很故含義的面試題。該題以及它的變體經常展目前各大公司的面試、筆試題
中。
看到這道題後,第一反響是過去到後輸出比擬容易。於是很慷慨地想到把鏈表中鏈接結點的
指針反轉到來,改換鏈表的方向。然後就能夠過去到後輸出了。反轉鏈表的算法詳見本人面
試題精選系列的第19題,在此不再細述。但該措施必需額外的壟斷,該當還有更好的措施。
接下來的設法是過去到後遍歷鏈表,每穿越一個結點的時候,把該結點放到一個棧中。當遍
歷徹底端鏈表後,再從棧頂開始輸出結點的值,此刻輸出的結點的次序曾經反轉到來了。該
措施必需維護一個額外的棧,告終起來比擬繁瑣。
既然想到了棧來告終這個函數,而遞歸性質上即便一個棧構造。於是很慷慨的又想到了用遞
歸來告終。要告終反到來輸出鏈表,我們每拜會到一個結點的時候,先遞歸輸出它後面的結
點,再輸出該結點切身,這麼鏈表的輸出收穫就反到來了。
*/

#include <cstdlib>
#include <iostream>

struct ListNode{
  int m_nKey;
  ListNode * m_pNext;
};

ListNode * createList(int * arr, int len, ListNode * head){
  if(arr == NULL || len < 1)  return NULL;
  for(int i = 0; i < len; ++i){
    ListNode * newnode = new ListNode;
    newnode->m_nKey = arr[i];
    newnode->m_pNext = NULL;
    if(head == NULL){
      head = newnode;
    }
    else{
      newnode->m_pNext = head;
      head = newnode;
    }
  }
  return head;
}

void printListNormal(ListNode * head){
  if(head == NULL)  return;
  ListNode * cur = head;
  while(cur != NULL){
    std::cout<<cur->m_nKey<<" ";
    cur = cur->m_pNext;
  }
  std::cout<<std::endl;
}

void printListReverse(ListNode * head){
  if(head == NULL)  return;
  printListReverse(head->m_pNext);
  std::cout<<head->m_nKey<<std::endl;
}

int main(int argc, char ** argv){
  int arr[] = {1,2,3,4,5,6,7,8};
  int len = sizeof(arr)/sizeof(int);
  ListNode * head = NULL;
  head = createList(arr, len, head);
  printListNormal(head);
  printListReverse(head);

  system("pause");
  return 0;
}

發佈了125 篇原創文章 · 獲贊 11 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章