從尾到頭打印鏈表
題目
輸入一個鏈表的頭結點,從尾到頭反過來打印出每個結點的值
思路
思路1:將鏈表反轉,再從頭遍歷輸出
思路2:從頭遍歷鏈表並壓棧,再打印棧數據
思路3:遞歸,從尾到頭打印
實現代碼
//思路1,反轉鏈表
//改變鏈表結構,將指針反轉
public static ListNode reverse1(ListNode headNode){
if(headNode == null)
return null;
ListNode pre = null;
while(headNode != null){
ListNode tmp = headNode.next; //找出下一位
headNode.next = pre; //吧當前的指針指向前面
pre = headNode; //向後移動繼續
headNode = tmp;
}
return pre; //pre爲新鏈表的head結點
}
思路2
//不改變鏈表結構,壓入棧中
public static ListNode reverse2(ListNode headNode){
Stack<ListNode> stack = new Stack<ListNode>(); //創建棧
while(headNode.next != null){ //吧結點壓入棧(最後一個結點沒壓)
stack.push(headNode);
headNode = headNode.next;
}
ListNode newHeadNode = headNode; //指向最後一個結點
while(!stack.empty()){ //出棧
headNode.next= stack.pop();
headNode = headNode.next;
}
headNode.next = null;
return newHeadNode;
}
思路3
//遞歸
public static ListNode reverse3(ListNode headNode){
if(headNode == null || headNode.next == null)
return headNode;
ListNode newHeadNode = reverse3(headNode.next);
headNode.next.next = headNode;
headNode.next = null;
return newHeadNode;
}
測試用例
public static void main(String[] args) {
//構建測試鏈表
ListNode headNode = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
ListNode node4 = new ListNode(5);
headNode.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = null;
ListNode reverseListNode = reverse3(headNode);
//打印
while(reverseListNode != null){
System.out.println(reverseListNode.node_value);
reverseListNode = reverseListNode.next;
}
}