1. 程式人生 > >java單鏈表反轉

java單鏈表反轉

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.非遞迴反轉