有三種思路,
第一就是利用棧先入後出的特性完成,
第二就是存下來而後進行數組翻轉。
第三是利用遞歸。
// 數組反轉實現方式java
java 遞歸超簡潔版本
public
class
Solution {
ArrayList<Integer> arrayList=
new
ArrayList<Integer>();
public
ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if
(listNode!=
null
){
this
.printListFromTailToHead(listNode.next);
arrayList.add(listNode.val);
}
return
arrayList;
}
}
關於頭插法,能夠next能夠理解成前一個節點地址,插入順序:node
一、頭節點傳入,開始建立A數據,頭節點的next指向A數據的內存地址,A節點的next替換成頭節點的數組
二、頭節點再傳入,建立B數據,頭節點的next又換成了指向B的內存地址,B節點的next替換頭節點的A;this
總結一下:插入時候,一直在頭節點的上面插入數據,原來的數據被「頂」上去了;spa
頭插法遍歷的時候,頭節點開始,一個一個往上遍歷。這樣最後插入的就做爲第一個輸出出來了;.net
尾插法編練插入,比較好理解,就是一直在「尾巴」追加,遍歷時候從頭開始,第一個插入的就第一個輸出出來; 指針
public class Test { static Node headNode; class Node { private Node next;//指針 private int data;//數據域 } //尾插法建立單鏈表 隊列形式先進先出 public void back(Node node, int data) { if (data < 10) { Node next = new Node(); next.data = data; next.next = null; node.next = next; back(next, ++data); } } //頭插法建立單鏈表 棧形式先進後出 public void head(Node node, int data) { if (data < 10) { Node next = new Node(); next.next = node.next; next.data = data; node.next = next; System.out.println("遞歸參數:" + node.data); head(node, ++data); } } public static void main(String[] args) { Test test = new Test(); headNode = test.new Node();//頭指針// new Test().back(headNode, 0);//前插法 new Test().head(headNode, 0);//後插法 System.out.println("建立後的鏈表是:");//0 1 2 3 4 5 6 7 8 9 10 while (headNode.next != null) { headNode = headNode.next; System.out.print(headNode.data + " "); } }}//————————————————//版權聲明:本文爲CSDN博主「另外一個絕影」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。//原文連接:https://blog.csdn.net/weixin_37817685/article/details/83305972