1. 程式人生 > 其它 >【leetcode 206】 反轉連結串列(簡單)

【leetcode 206】 反轉連結串列(簡單)

連結串列

概念:

  • 區別於陣列,連結串列中的元素不是儲存在記憶體中連續的一片區域,連結串列中的資料儲存在每一個稱之為「結點」複合區域裡,在每一個結點除了儲存資料以外,還儲存了到下一個結點的指標(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;

    }
}

如果覺得文章對你有幫助的話,請點個推薦吧!