輸入一個鏈表的頭結點,從尾到頭反過來輸出每個結點的值。鏈表結點定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
方法一:先逆序鏈表在順序遍歷
方法二:採用棧,順序遍歷鏈表,將每個節點壓棧,然後彈棧
方法三:採用遞歸,每次調用都先轉化爲對下一個節點的調用,在輸出
///////////////////////////////////////////////////////////////////////
// Print a list from end to beginning
// Input: pListHead - the head of list
///////////////////////////////////////////////////////////////////////
void PrintListReversely(ListNode* pListHead)
{
if(pListHead != NULL)
{
// Print the next node first
if (pListHead->m_pNext != NULL)
{
PrintListReversely(pListHead->m_pNext);
}
// Print this node
printf("%d", pListHead->m_nKey);
}
}
擴展:該題還有兩個常見的變體:
1. 從尾到頭輸出一個字符串;
void reversePrintString(const char * str)
{
if (!str) return;
if (*str != 0) reversePrintString(++str);
else return;
printf("%c", *str);
}
2. 定義一個函數求字符串的長度,要求該函數體內不能聲明任何變量。
int GetStrLen(char* str)
{
if(str != NULL)
{
if((*str) != '/0')
{
return GetStrLen(++str) + 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
轉貼自:http://zhedahht.blog.163.com/blog/static/2541117420079237185699/