【leetcode 206】 反轉連結串列(簡單)
阿新 • • 發佈:2022-06-01
連結串列
概念:
- 區別於陣列,連結串列中的元素不是儲存在記憶體中連續的一片區域,連結串列中的資料儲存在每一個稱之為「結點」複合區域裡,在每一個結點除了儲存資料以外,還儲存了到下一個結點的指標(Pointer)。
- 由於不必按順序儲存,連結串列在插入資料的時候可以達到 O(1)O(1) 的複雜度,但是查詢一個結點或者訪問特定編號的結點則需要 O(n) 的時間。
應用
- HashMap Node 節點,Node節點有自身的值和 next 指向:
//HashMap Node 部分原始碼 static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) { this.hash = hash; this.key = key; this.value = value; this.next = next; } }
- LinkedList Node 結點使用雙鏈表
//LinkedList 部分原始碼
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
題目描述
解題思路
單鏈表的反轉就是把連結串列的指向換一個方向,由從左往右變成從右變左。
主要解題思路是拆分每一個指標。
上圖從 1 指向 2 變成 2 指向1,也就是需要設定 2 節點的next = 1
,在做指向的改變之前要先將 2 節點的 next 存起來,然後改變 2 節點的next:
- 建立一個空連結串列 node,用來儲存反轉的連結串列。
- 儲存連結串列的 next。
- 連結串列的 next 指向 node。
- 當前連結串列賦值給 node。
- 迴圈遍歷下一個節點
Java 解題程式碼:
class Solution { public ListNode reverseList(ListNode head) { ListNode cur = head; // 建立一個空連結串列 ListNode node= null; while(cur != null) { // 儲存 next ListNode next = cur.next; // 當前連結串列指向指向新的連結串列 cur.next = node; // 當前節點賦值給 node node = cur; // 遍歷下一個節點 cur = next; } return pre; } }
如果覺得文章對你有幫助的話,請點個推薦吧!