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.......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM