題目描述:
逆序打印單鏈表,要求不能改變鏈表結(jié)構(gòu)。
思路分析:
由于單鏈表只能順序遍歷(從頭到尾遍歷)而不能逆向遍歷,所以,要逆序打印單鏈表,則必需要用到先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),我們很容易想到棧。
而運(yùn)用了棧結(jié)構(gòu)的實(shí)現(xiàn)主要有兩種:
1. 遞歸:遞歸內(nèi)部包括了一個(gè)方法調(diào)用棧。
2. Stack:Java中棧數(shù)據(jù)結(jié)構(gòu)的默認(rèn)實(shí)現(xiàn)。
代碼實(shí)現(xiàn):
方法1:遞歸實(shí)現(xiàn)
// 使用遞歸實(shí)現(xiàn)鏈表逆序打印
public void reversePrint(LinkedNode node) {
if (node == null) {
return;
}
reversePrint(node.next);
System.out.println(node.element);
}
方法2:循環(huán)實(shí)現(xiàn)
// 使用棧(Stack)逆序打印單鏈表
public void reversePrint(LinkedNode header) {
Stack<LinkedNode> stack = new Stack<>();
LinkedNode currentNode = header;
while (currentNode != null) {
stack.push(currentNode);
currentNode = currentNode.next;
}
while (stack.size() > 0) {
LinkedNode node = stack.pop();
System.out.println(node);
}
}
總結(jié):
由于單鏈表無(wú)法逆序遍歷,而且題目要求不得改變鏈表結(jié)構(gòu),因此只能使用先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)(棧)。
而遞歸方法的調(diào)用順序就正好是一個(gè)先進(jìn)后出的結(jié)構(gòu),因此可以使用遞歸實(shí)現(xiàn)。當(dāng)然,也可以借助外部存儲(chǔ)空間實(shí)現(xiàn),比如棧,集合等,當(dāng)然,棧比集合是更合適的選擇。