Java单链表反转 详细过程
生活随笔
收集整理的這篇文章主要介紹了
Java单链表反转 详细过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java單鏈表反轉 Java實現單鏈表翻轉
? ? 【尊重原創,轉載請注明出處】http://blog.csdn.net/guyuealian/article/details/51119499(一)單鏈表的結點結構:? ? ? data域:存儲數據元素信息的域稱為數據域;
? ??next域:存儲直接后繼位置的域稱為指針域,它是存放結點的直接后繼的地址(位置)的指針域(鏈域)。
? ? data域+ next域:組成數據ai的存儲映射,稱為結點;
? ? 注意:①鏈表通過每個結點的鏈域將線性表的n個結點按其邏輯順序鏈接在一起的。
? ? ? ? ? ②每個結點只有一個鏈域的鏈表稱為單鏈表(Single Linked List)。
? ? ?所謂的鏈表就好像火車車廂一樣,從火車頭開始,每一節車廂之后都連著后一節車廂。
? ? ?要實現單鏈表存儲,首先是創建一結點類,其Java代碼如下:class Node {private int Data;// 數據域private Node Next;// 指針域public Node(int Data) {// super();this.Data = Data;}public int getData() {return Data;}public void setData(int Data) {this.Data = Data;}public Node getNext() {return Next;}public void setNext(Node Next) {this.Next = Next;} }(二)實現反轉的方法:
? (1)遞歸反轉法:在反轉當前節點之前先反轉后續節點。這樣從頭結點開始,層層深入直到尾結點才開始反轉指針域的指向。簡單的說就是從尾結點開始,逆向反轉各個結點的指針域指向,其過程圖如下所示:
? ?head:是前一結點的指針域(PS:前一結點的指針域指向當前結點)
? ?head.getNext():是當前結點的指針域(PS:當前結點的指針域指向下一結點)
? ?reHead:是反轉后新鏈表的頭結點(即原來單鏈表的尾結點)
Java代碼實現:package javatest1; public class javatest1 {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);head.setNext(node1);node1.setNext(node2);node2.setNext(node3);// 打印反轉前的鏈表Node h = head;while (null != h) {System.out.print(h.getData() + " ");h = h.getNext();}// 調用反轉方法head = Reverse1(head);System.out.println("\n**************************");// 打印反轉后的結果while (null != head) {System.out.print(head.getData() + " ");head = head.getNext();}}/*** 遞歸,在反轉當前節點之前先反轉后續節點*/public static Node Reverse1(Node head) {// head看作是前一結點,head.getNext()是當前結點,reHead是反轉后新鏈表的頭結點if (head == null || head.getNext() == null) {return head;// 若為空鏈或者當前結點在尾結點,則直接還回}Node reHead = Reverse1(head.getNext());// 先反轉后續節點head.getNext()head.getNext().setNext(head);// 將當前結點的指針域指向前一結點head.setNext(null);// 前一結點的指針域令為null;return reHead;// 反轉后新鏈表的頭結點} }class Node {private int Data;// 數據域private Node Next;// 指針域public Node(int Data) {// super();this.Data = Data;}public int getData() {return Data;}public void setData(int Data) {this.Data = Data;}public Node getNext() {return Next;}public void setNext(Node Next) {this.Next = Next;}}
(2)遍歷反轉法:遞歸反轉法是從后往前逆序反轉指針域的指向,而遍歷反轉法是從前往后反轉各個結點的指針域的指向。? ?基本思路是:將當前節點cur的下一個節點 cur.getNext()緩存到temp后,然后更改當前節點指針指向上一結點pre。也就是說在反轉當前結點指針指向前,先把當前結點的指針域用tmp臨時保存,以便下一次使用,其過程可表示如下:
? ?pre:上一結點
? ?cur: 當前結點
? ?tmp:?臨時結點,用于保存當前結點的指針域(即下一結點)
Java代碼實現:package javatest1; public class JavaTest1 {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);head.setNext(node1);node1.setNext(node2);node2.setNext(node3);// 打印反轉前的鏈表Node h = head;while (null != h) {System.out.print(h.getData() + " ");h = h.getNext();}// 調用反轉方法// head = reverse1(head);head = reverse2(head);System.out.println("\n**************************");// 打印反轉后的結果while (null != head) {System.out.print(head.getData() + " ");head = head.getNext();}}/*** 遍歷,將當前節點的下一個節點緩存后更改當前節點指針*/public static Node reverse2(Node head) {if (head == null)return head;Node pre = head;// 上一結點Node cur = head.getNext();// 當前結點Node tmp;// 臨時結點,用于保存當前結點的指針域(即下一結點)while (cur != null) {// 當前結點為null,說明位于尾結點tmp = cur.getNext();cur.setNext(pre);// 反轉指針域的指向// 指針往下移動pre = cur;cur = tmp;}// 最后將原鏈表的頭節點的指針域置為null,還回新鏈表的頭結點,即原鏈表的尾結點head.setNext(null);return pre;} }class Node {private int Data;// 數據域private Node Next;// 指針域public Node(int Data) {// super();this.Data = Data;}public int getData() {return Data;}public void setData(int Data) {this.Data = Data;}public Node getNext() {return Next;}public void setNext(Node Next) {this.Next = Next;} }
如果你覺得該帖子幫到你,還望貴人多多支持,鄙人會再接再厲,繼續努力的~
總結
以上是生活随笔為你收集整理的Java单链表反转 详细过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java有序表查找:折半查找、二分查找、
- 下一篇: Merge的用法