從尾到頭列印單鏈表(劍指offer面試題5)

2021-07-02 16:27:26 字數 2028 閱讀 8889

【題目】輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。

【分析】此題考察單鏈表的理解和應用,為了實現列印,必須先建立乙個單鏈表,頭結點可有可無,但有頭結點和無頭結點在程式設計上是應該注意的,反向列印思路不一樣,這裡以包含頭結點舉例分析,單鏈表以尾部插入方式建立,頭結點資料域為空,頭結點指標指向下一結點,反向列印的思想,有兩種,一種以棧的形式,一種遞迴的形式。

1. 以棧的思想反向列印,主要是利用鍊錶在訪問時總是從頭開始訪問,那麼在訪問的同時,將結點資料壓棧,邊訪問邊壓棧,棧的特點就是先進後出,所以壓棧進去時就是鍊錶的順序讀入,出棧時就是鍊錶的反向輸入。

2. 以遞迴形式反向列印,主要是利用鍊錶訪問的層層遞迴,每訪問到乙個結點,就遞迴訪問輸出後面的乙個結點,然後再輸出結點自身,最終就是反向輸出。

【演算法遞迴實現】

#include

#include

typedef int data_type;

typedef struct node node_t;// 給struct node取個別名node_t

typedef struct node * node_ptr;//給struct node*取個別名node_ptr

typedef struct node

;node_t * init()

//在鍊錶後面插入結點

node_t *insert_back(node_ptr p , data_type data)

//反向列印

void print_reverse(node_ptr p)

printf("%d\n",p->

data);

}}void main()

【輸出】

【說明】上例中所建單鏈表是利用兩個單指標完成的,list指標用於指向煉表頭結點,pnode指向新增節點後的尾結點,訪問時因為頭結點資料域為記憶體隨機數,按照反向列印判斷是否為空時,應該移動到頭節點的下一節點,如果不移動,直接從頭節點開始判斷,會發現,列印出來的多出了乙個隨機數,就是頭結點的資料域,這是因為頭結點位址不為空,最後遞迴回來時頭結點就是第乙個結點的前一節點,就會列印出來,可以例項操作一下,就會發現問題。

【注意】struct用法 ,typedef用法, 指標位址如何傳遞

【完整**】

#include

#include

#include

typedef

int data_type;

typedef

struct node node_t;// 給struct node取個別名node_t

typedef

struct node * node_ptr;//給struct node*取個別名node_ptr

typedef

struct node

;node_t * init()

//在鍊錶後面插入結點

node_t *insert_back(node_ptr p , data_type data)

//正常列印

void print(node_ptr p)

printf("%d ", p->data);

printf("\n");

}//利用遞迴反向輸出

void print_reverse(node_ptr p)

printf("%d ",p->data);

}}//利用棧反向輸出

void push_print(node_ptr p)

while(!nodes.empty())

printf("\n");

free(pnew);

}void main()

【輸出】

鍊錶順序輸出,遞迴反向列印,棧反向列印

從尾到頭列印單鏈表

由於單鏈表只能從按單個方向訪問下乙個節點,而不能訪問前乙個節點。首先,解決這個問題肯定要遍歷鍊錶。遍歷的順序是從頭到尾的順序,可輸出的順序卻是從尾到頭。也就是說第乙個遍歷到的結點最後乙個輸出,而最後乙個遍歷到得結點第乙個輸出。這就是典型的 後進先出 可以用 棧實現這種順序。實現程式過程 每經過乙個結...

從尾到頭列印單鏈表

include using namespace std include includetypedef struct node 節點結構 node node create 尾插法建立單鏈表 else q p p node malloc sizeof node p next null if flag 0...

從尾到頭列印單鏈表

可運用兩種方法列印 方法一 迴圈演算法 方法二 遞迴壓棧呼叫 方法一 先呼叫我們已經寫好的煉表頭檔案list.h鍊錶構造方面不過多說明。void printreverse listnode first 要列印的結點 printf d cur data end cur 1.通過cur next end...