1. 程式人生 > >java單鏈表反轉(花了半個多小時的作品)

java單鏈表反轉(花了半個多小時的作品)

歡迎光臨...............

首先我們要搞清楚連結串列是啥玩意兒?先看看定義:

         講連結串列之前我們先說說Java記憶體的分配情況:我們new物件的時候,會在java堆中為物件分配記憶體,當我們呼叫方法的時候,會將方法載入到方法區,在方法區儲存了載入類的資訊,常量,靜態變數等等。搞明白這個我們再來講連結串列。

       連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 這個定義估計太過書面化,對初學者來說,不好理解,其實簡單點說就是醬紫的。我們建立了一個類Node,這個類當中有兩個變數,一個data用於儲存資料,還有一個Node型別的變數next用於儲存另一個物件在java堆中的地址。然後new了很多個Node類的物件,我們通過setNext方法將第二個物件node2的地址給node1儲存起來,同樣的將第三個物件node3的地址交給node2儲存起來。通過這種方式,我們就將很多個物件連成串了,形成了一種鏈狀。這就是連結串列了。

       這兒著重宣告:在Java中,沒有地址一說,只有hashCode。其實hashCode就是通過演算法,將每一個物件的地址算成一個code轉成一個特有的字串。當我們沒有複寫Object類的toString方法的時候,該類的物件呼叫toString方法,打印出來,或者不呼叫toString方法,直接列印該類的物件,其實就是將hashCode打印出來了。這個hashCode就相當於是記憶體了。

先上一張圖片:

可能不是很好理解:

  迭代法。先將下一節點紀錄下來,然後讓當前節點指向上一節點,再將當前節點紀錄下來,再讓下一節點變為當前節點。

 

 

程式碼:

 1 package com.atguigu.reverse;
 2 
 3 public class LinkedList {
 4     public static void main(String[] args) {
 5         Node node = new Node(1);
 6         node.next = new Node(2);
 7         node.next.next = new
Node(3); 8 node.next.next.next = new Node(4); 9 Node res = reverse(node); 10 System.out.println(res); 11 } 12 13 public static Node reverse(Node node){ 14 //如何連結串列沒有元素,返回null值。 15 if(node == null){ 16 return null; 17 }
18 19 //如果連結串列只有一個元素,不必要反轉,返回連結串列本身就行。 20 if(node.next == null){ 21 return node; 22 } 23 24 //當連結串列超過兩個及以上就需要反轉 25 Node pre = null;//用於儲存當前節點的前一個節點 26 Node cur = node;//cur儲存當前節點 27 28 while(cur != null){ 29 Node next = cur.next;//獲取當前節點的下一個元素 30 cur.next = pre;//把當前節點的next指向前一個元素 31 pre = cur;//把當前節點改為前一個節點(其實就是前一個元素後移一位)。 32 cur = next;//把當前節點的下一個節點改為當前節點(其實就是前一個元素後移一位)。 33 } 34 35 //因為反轉後pre是第一個節點,所以返回pre. 36 return pre; 37 } 38 } 39 40 class Node{ 41 public Integer data; 42 public Node next; 43 public Node(Integer data) { 44 super(); 45 this.data = data; 46 } 47 @Override 48 public String toString() { 49 return "Node [data=" + data + ", next=" + next + "]"; 50 } 51 }

 

ok.......