【劍指Offer學習】【面試題16 :反轉連結串列】
阿新 • • 發佈:2019-01-06
題目:定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並輸出反轉後連結串列的頭結點。
連結串列結點定義如下:
public static class ListNode {
int value;
ListNode next;
}
解題思路:
在單鏈表的表頭臨時接入一個節點,然後進行尾插法操作。反轉單鏈表。
程式碼實現:
public class Test16 {
public static class ListNode {
int value;
ListNode next;
}
/**
* 定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並輸出反轉後連結串列的頭結點。
*
* @param head 連結串列的頭結點
* @return 反轉後的連結串列的頭結點
*/
public static ListNode reverseList(ListNode head) {
// 建立一個臨時結點,當作尾插法的邏輯頭結點
ListNode root = new ListNode();
// 邏輯頭結點點的下一個結點為空
root.next = null;
// 用於記錄要處理的下一個結點
ListNode next;
// 當前處理的結點不為空
while (head != null) {
// 記錄要處理的下一個結點
next = head.next;
// 當前結點的下一個結點指向邏輯頭結點的下一個結點
head.next = root.next;
// 邏輯頭結點的下一個結點指向當前處理的結點
root.next = head;
// 上面操作完成了一個結點的頭插
// 當前結點指向下一個要處理的結點
head = next;
}
// 邏輯頭結點的下一個結點就是返回後的頭結點
return root.next;
}
/**
* 定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並輸出反轉後連結串列的頭結點。
* 【書本上的方法,不使用邏輯頭結點】
*
* @param head 連結串列的頭結點
* @return 反轉後的連結串列的頭結點
*/
public static ListNode reverseList2(ListNode head) {
// 用於記錄反轉後的連結串列的頭結點
ListNode reverseHead = null;
// 用於記錄當前處理的結點的
ListNode curr = head;
// 用於記錄當前結點的前驅結點
// 前驅結點開始為null,因為了是反轉後的最後一個結點的下一個結點,即null
ListNode prev = null;
// 當前結點的下一個結點
ListNode next;
// 對連結串列進行尾插法操作
while (curr != null) {
// 記錄當前處理的結點,最後一個記錄的結點就是反轉後的頭結點
// 【注意:與書上的不同,因為curr.next=null時,curr此時就最後一個處理的結點,
// 對應到反轉後的連結串列就是第一個結點,書上那樣做更精確,只是多了一些判斷,可以不要if】
reverseHead = curr;
// 記錄當然前下一個結點
next = curr.next;
// 當前結點的下一個結點指向前驅結點,這樣當前結點就插入到了反轉連結串列的頭部
curr.next = prev;
// 記錄當前結點為前驅結點
prev = curr;
// 當前結點點移動到下一個結點
curr = next;
}
// 返回轉後的頭結點
return reverseHead;
}
/**
* 輸出連結串列的元素值
*
* @param head 連結串列的頭結點
*/
public static void printList(ListNode head) {
while (head != null) {
System.out.print(head.value + "->");
head = head.next;
}
System.out.println("null");
}
public static void main(String[] args) {
ListNode head = new ListNode();
head.value = 1;
head.next = new ListNode();
head.next.value = 2;
head.next.next = new ListNode();
head.next.next.value = 3;
head.next.next.next = new ListNode();
head.next.next.next.value = 4;
head.next.next.next.next = new ListNode();
head.next.next.next.next.value = 5;
head.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.value = 6;
head.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.value = 7;
head.next.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.next.value = 8;
head.next.next.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.next.next.value = 9;
printList(head);
head = reverseList(head);
printList(head);
head = reverseList2(head);
printList(head);
}
}
執行結果: