Java 反轉連結串列的兩種方法
阿新 • • 發佈:2019-02-17
目錄
連結串列節點的資料結構
- 連結串列的資料結構主要是由兩部分組成的,顯而易見,一個就是當前的節點儲存的資料,一個就是指向下一個節點。
/**
* 連結串列的節點
*
* @author yingmu
*
*/
public class Node {
private char Data;// 資料域
private Node Next;// 指標域
public Node(char Data) {
// super();
this.Data = Data;
}
public char getData() {
return Data;
}
public void setData(char Data) {
this.Data = Data;
}
public Node getNext() {
return Next;
}
public void setNext(Node Next) {
this.Next = Next;
}
}
方法一:遍歷
/**
* 遍歷方法
*
* @param current
* @return
*
*/
public static Node reverseList2(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;
}
方法二:遞迴
/**
* 遞迴,在反轉當前節點之前先反轉後續節點
*
* @param head
* @return
*
*/
public static Node reverseList1(Node head) {
// head看作是前一結點,head.getNext()是當前結點,reHead是反轉後新連結串列的頭結點
if (head == null || head.getNext() == null) {
return head;// 若為空鏈或者當前結點在尾結點,則直接還回
}
Node reHead = reverseList1(head.getNext());// 先反轉後續節點head.getNext()
head.getNext().setNext(head);// 將當前結點的指標域指向前一結點
head.setNext(null);// 前一結點的指標域令為null;
return reHead;// 反轉後新連結串列的頭結點
}