輸入乙個鍊錶的頭節點,從尾到頭反過來列印出每個節點的值。鍊錶節點定義如下:
struct listnode
};
從尾到頭列印,能否改變原來的鍊錶?(是否允許修改輸入資料)
1.能改變原來的鍊錶,將鍊錶的指標反過來。
2.使用棧(遞迴)
插入節點
//在鍊錶的尾端插入乙個節點 若煉表為空,則頭指標的值會改變 所以要使用指向指標的指標作為函式引數
void
addtotail
(listnode*
* phead,
int value)
//3.鍊錶不為空
else
pcur->m_pnext = pnew;
//節點插入鍊錶末端
}return;
}
刪除節點//刪除鍊錶中第乙個與給定值相同的節點 當刪除的是頭節點 頭指標的值會改變 所以要使用指向指標的指標作為函式引數
void
removenode
(listnode*
* phead,
int value)
//4.刪除的不是頭節點
else
if(pcur->m_nvalue == value)
else
}//5.釋放節點記憶體
if(ptobedeleted)
return;
}
//一、使用c++中的容器stack
void
printlistreversingly_iteratively
(listnode* phead)
//3.出棧列印
while
(!nodes.
empty()
)return;}
//二、遞迴在本質上是乙個棧 遞迴實現
void
printlistreversingly_recursively
(listnode* phead)
printlistreversingly_recursively
(phead->m_pnext)
;printf
("%d\t"
,phead->m_nvalue)
;return;}
//當鍊表很長,遞迴寫法會導致函式呼叫層數過深,可能導致函式呼叫棧溢位
//用棧基於迴圈的實現**魯棒性好。
面試題6 從尾到頭列印鍊錶
一 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。二 關鍵 後進先出 的例子,因此可以使用棧 遞迴來實現功能。三 解釋 四 其他方法 把鍊錶中的指標反轉過來。使用兩個指標,p1和p2,p1的初始值是表頭,p2的初始值是p1 next,只要p2 null,那麼就進行p1 next p2...
面試題6 從尾到頭列印鍊錶
輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist。占用記憶體 9572k public arraylist printlistfromtailtohead02 listnode listnode stack stack newstack listnode p listnode while...
面試題6 從尾到頭列印鍊錶
題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 思路 逆向輸出,如果不改變鍊錶的結構,可借助棧實現該功能,因為棧有 先進後出 的特點。include include using namespace std typedef struct listnode listnode 在末尾增加乙個...