java單鏈表反轉
阿新 • • 發佈:2019-01-04
java 單鏈表反轉
因為面試考到了一些演算法,也都忘的差不多了,學習了單鏈表之後,想把內容下來。這篇文章主要介紹什麼是單鏈表以及單鏈表的反轉方式:
連結串列定義:
連結串列是一種遞迴的資料結構,它或者為空(null),或者是指向一個結點(node)的引用,該結點含有一個泛型的元素和一個指向另一條連結串列的引用。
我的理解就是:連結串列是由一個一個的結點組成,結點呢,是由一個元素和一個指向另一個結點的引用組成。舉個例子,火車就好比一條連結串列,一節一節的車廂就是結點。車廂裡面的人就是結點中存在的元素,1號車廂連線2號車廂即1個結點指向下一個結點。
結點抽象成程式碼就是:
private class Node{
Item item;
Node next;
}
一個Node物件包含兩個例項變數,型別分別為Item(引數型別)和Node。
我們通過new Node()觸發建構函式來建立一個Node型別的物件。呼叫的結果是一個指向Node物件的引用,它的例項變數均被初始化為null。
如何定義一個節點:
private class Node{
int data;//資料域 ,(引數型別為int)
Node next;//指標域
//傳資料域的建構函式
public Node(int data) {
this.data = data;
}
//省略get set
...
}
如何反轉單鏈表
1.遞迴反轉
遞迴反轉的思想:
在反轉一個結點前先反轉下一個結點,將尾結點作為頭結點。
實現程式碼:
public class Reverse {
public static void main(String[] args){
Node head = new Node(0);//第一個結點,即頭結點
Node node1 = new Node(1);//頭結點之後的第一個結點
Node node2 = new Node(2);
Node node3 = new Node(3 );
Node tail = new Node(4);//尾結點
//設定指標域
head.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(tail);
//從頭結點開始迴圈列印
Node node = head;
while (node!=null){
System.out.println(node.getData());
node = node.getNext();
}
head = reverse(head);
System.out.println("反轉後的列印結果");
while (head!=null){
System.out.println(head.getData());
head = head.getNext();
}
}
//遞迴反轉
public static Node reverse(Node head){
// head看作是前一結點,
// head.getNext()是當前結點
// reHead是反轉後新連結串列的頭結點
if (head == null || head.getNext() == null) {
// 若為空鏈或者當前結點在尾結點,則直接還回
return head;
}
Node last = reverse(head.getNext());// 先反轉head的下一個結點
head.getNext().setNext(head);// 將當前結點指向前一結點
head.setNext(null);// 前一結點的指標域令為null;
return last;// 反轉後新連結串列的頭結點
}
}
2.非遞迴反轉