溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何從尾到頭打印鏈表

發布時間:2021-12-15 14:41:29 來源:億速云 閱讀:178 作者:小新 欄目:大數據
# LeetCode如何從尾到頭打印鏈表

## 問題描述

題目鏈接:[劍指 Offer 06. 從尾到頭打印鏈表](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/)

**題目要求**:  
輸入一個鏈表的頭節點,從尾到頭反過來返回每個節點的值(用數組返回)。

**示例**:
```python
輸入:head = [1,3,2]
輸出:[2,3,1]

解題思路分析

鏈表基礎回顧

鏈表是一種線性數據結構,通過指針將零散的內存塊串聯起來。每個節點包含: - 數據域(存儲值) - 指針域(存儲下一個節點的地址)

本題中的鏈表是單向鏈表,只能從頭節點開始順序訪問。

關鍵挑戰

由于鏈表是單向的,無法直接逆向訪問節點。需要找到一種方法,在不修改鏈表結構的前提下實現逆向輸出。

方法一:棧輔助法(推薦)

核心思想

利用棧的后進先出(LIFO)特性實現逆序: 1. 遍歷鏈表,將節點值依次壓入棧 2. 彈出棧中元素存入結果數組

代碼實現(Python)

def reversePrint(head):
    stack = []
    while head:
        stack.append(head.val)
        head = head.next
    return stack[::-1]  # 反向切片等效于出棧

復雜度分析

  • 時間復雜度:O(n)
    遍歷鏈表和棧操作各需 O(n)
  • 空間復雜度:O(n)
    需要額外??臻g存儲所有節點值

變體寫法

# 顯式使用棧操作
def reversePrint(head):
    stack = []
    res = []
    while head:
        stack.append(head.val)
        head = head.next
    while stack:
        res.append(stack.pop())
    return res

方法二:遞歸法

核心思想

利用遞歸的回溯階段實現逆序輸出: 1. 遞歸到鏈表末尾 2. 回溯時收集節點值

代碼實現

def reversePrint(head):
    return recur(head, [])

def recur(node, res):
    if not node:
        return res
    res = recur(node.next, res)
    res.append(node.val)
    return res

復雜度分析

  • 時間復雜度:O(n)
    遞歸深度為鏈表長度
  • 空間復雜度:O(n)
    遞歸調用棧的空間消耗

注意事項

鏈表較長時可能導致棧溢出,實際工程中建議使用棧輔助法。

方法三:兩次遍歷法

核心思想

  1. 第一次遍歷獲取鏈表長度
  2. 初始化結果數組
  3. 第二次遍歷倒序填充數組

代碼實現

def reversePrint(head):
    length = 0
    curr = head
    while curr:
        length += 1
        curr = curr.next
    
    res = [0] * length
    curr = head
    for i in range(length-1, -1, -1):
        res[i] = curr.val
        curr = curr.next
    return res

復雜度分析

  • 時間復雜度:O(2n) → O(n)
    兩次線性遍歷
  • 空間復雜度:O(1)
    結果數組不計入額外空間(題目要求返回數組)

方法對比

方法 時間復雜度 空間復雜度 適用場景
棧輔助法 O(n) O(n) 通用解法
遞歸法 O(n) O(n) 鏈表較短時
兩次遍歷法 O(n) O(1) 空間限制嚴格時

邊界條件處理

實際編碼時需考慮: 1. 空鏈表輸入:head = None 2. 單節點鏈表:head = [1] 3. 大規模鏈表測試(特別是遞歸法)

擴展思考

如果允許修改鏈表結構?

可采用鏈表反轉法: 1. 先反轉鏈表 2. 順序遍歷存儲值 3. 恢復鏈表原狀(如有需要)

def reversePrint(head):
    if not head:
        return []
    
    # 反轉鏈表
    prev = None
    curr = head
    while curr:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node
    
    # 存儲結果
    res = []
    while prev:
        res.append(prev.val)
        prev = prev.next
    
    return res

其他語言實現要點

  • C++:注意指針操作和內存管理
  • Java:使用ArrayList動態數組
  • JavaScript:數組的unshift()方法(但時間復雜度變高)

總結

從尾到頭打印鏈表是考察逆向思維的經典題目,主要解決方案包括: 1. 棧輔助法:最直觀的解法,推薦掌握 2. 遞歸法:簡潔但需注意棧深度 3. 兩次遍歷法:空間最優解

建議在面試中: 1. 首先說明所有可能的解法 2. 分析各方法優劣 3. 選擇最合適的方法實現

相關題目

”`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女