歡迎光臨...............
首先我們要搞清楚鏈表是啥玩意兒?先看看定義:
講鏈表之前我們先說說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.......