每日一刷之劍指Offer(5)從尾到頭列印鍊表

2021-03-02 Microstrong
題目快速預覽解題思路

(1)遞歸遍歷鍊表輸出

#encoding:utf-8
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class SingleLinkedList:
def __init__(self):
self.head = None
self.tail = None

def add(self, data):
node = ListNode(data)
if self.head is None:
self.head = node
self.tail = node
else:
self.tail.next =node
self.tail = node

def iter(self):
if not self.head:
return
cur = self.head
yield cur.val
while cur.next:
cur = cur.next
yield cur.val

class Solution:
# 返回從尾部到頭部的列表值序列,例如[1,2,3]
def printListFromTailToHead(self, listNode):
if listNode is None:
return []
return self.printListFromTailToHead(listNode.next) + [listNode.val]

if __name__=="__main__":
link_list = SingleLinkedList()
for i in range(5):
link_list.add(i)

for node in link_list.iter():
print("node is {0}".format(node))

solution = Solution()
# Python遞歸實現。
print(solution.printListFromTailToHead(link_list.head))

(2)順序遍歷鍊表,反轉遍歷的結果

def printListFromTailToHead(self, listNode):
if not listNode:
return []
res = []
index = listNode
while index:
res.append(index.val)
index = index.next

return res[::-1]

(3)輔助棧法

解題思路:

鍊表特點:只能從前至後訪問每個節點。

題目要求:倒序輸出節點值。

這種先入後出的需求可以藉助來實現。

算法流程:

入棧:遍歷鍊表,將各節點值push入棧。(Python使用append()方法,Java藉助LinkedList的addLast()方法)。

出棧:將各節點值pop出棧,存儲於數組並返回。(Python直接返回stack的倒序列表,Java新建一個數組,通過popLast()方法將各元素存入數組,實現倒序輸出)。

複雜度分析:

時間複雜度O(N):入棧和出棧共使用O(N)時間。

空間複雜度O(N):輔助棧stack和數組res共使用O(N)的額外空間。

def printListFromTailToHead(self, listNode):
stack = []
while listNode:
stack.append(listNode.val)
listNode = listNode.next
return stack[::-1]

(4)鍊表原地反轉

def printListFromTailToHead(self, listNode):
if not listNode:
return []

p1 = listNode
p2 = listNode.next
p3 = listNode.next.next
while p2:
p3 = p2.next
p2.next = p1
p1 = p2
p2 = p3
listNode.next = None
listNode = p1

res = []
while listNode:
res.append(listNode.val)
listNode = listNode.next

return res

Reference:

【1】Python數據結構-鍊表。地址:http://zhaochj.github.io/2016/05/12/2016-05-12-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84-%E9%93%BE%E8%A1%A8/

點擊左下角閱讀原文即可快速跳轉至牛客網在線提交地址,大家快去提交代碼哦!

讚賞一下,讓分享更有動力!

相關焦點

  • 數據結構中的鍊表,你知道多少?
    對於循環鍊表,你可以想像成y一個閉環的鍊表。也就是最後一個元素又指向了第一個元素。其特點是這裡的討論重點。特點(1)適合合併兩個循環鍊表:有了尾指針直接合併,比如說下面有兩個循環鍊表。現在使用尾指針合併他們。
  • 18.1在 O(1) 時間內刪除鍊表節點(劍指 Offer 題解Java版)
    >解題思路測試用例18.1 在 O(1) 時間內刪除鍊表節點題目描述給定單向鍊表的頭指針和一個結點指針,定義一個函數在解題思路①如果該節點不是尾節點,那麼可以直接將下一個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下一個節點,時間複雜度為O(1)。②否則,就需要先遍歷鍊表,找到節點的前一個節點,然後讓前一個節點指向null,時間複雜度為O(N)。
  • 劍指offer python實現 66道算法題
    鍊表3.從尾到頭列印鍊表題目:輸入一個鍊表,從尾到頭列印鍊表每個節點的值。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)22.從上往下列印二叉樹題目:從上往下列印出二叉樹的每個節點,同層節點從左至右列印。
  • Leetcode刷題-鍊表
    劍指 Offer 22. 鍊表中倒數第k個節點難度:簡單輸入一個鍊表,輸出該鍊表中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊表的尾節點是倒數第1個節點。例如,一個鍊表有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。
  • 數據結構之鍊表
    數據是最重要的財富數據結構之鍊表## 什麼是鍊表鍊表一種時間複雜度和空間複雜度為線性的數據結構單鍊表不管元素的在前面還是後面都需要從頭節點出發,使用雙鍊表我們可以根據元素的位置選擇從頭節點開始出發或者尾節點出發。這裡實現的只帶頭節點的雙向鍊表。
  • 劍指 Offer 55 - II. 平衡二叉樹 - leetcode 劍指offer系列
    題目難度: 簡單原題連結[1]今天繼續更新劍指 offer 系列, 老樣子晚上 6 點 45 分準時更新公眾號 每日精選算法題, 大家記得關注哦~ 另外在公眾號裡回復 offer 就能看到劍指 offer 系列當前連載的所有文章了題目描述輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。
  • 刷題兩個月,從入門到字節跳動offer,這是我的模板|GitHub1.2k星
    為什麼要先刷練習題呢?作者說了,因為這些題目都是按照類型歸類,且一開始還有詳細的知識點解析。題目也是常見的高頻題,很有代表性,大部分都是可以用模版加一點變形做出來的。這樣刷完了之後就會對大部分題目有個最基本的認識。
  • 劍指 Offer 58 - I. 翻轉單詞順序 - leetcode 劍指offer系列
    題目難度: 簡單原題連結[1]今天繼續更新劍指 offer 系列, 老樣子晚上 6 點 45 分準時更新公眾號 每日精選算法題, 大家記得關注哦~ 另外在公眾號裡回復 offer 就能看到劍指 offer 系列當前連載的所有文章了題目描述輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。
  • Anki實戰-刷leetcode之「141-環形鍊表」
    有同學說自己刷leetcode的時候每次刷完就忘,忘了再刷。
  • 什麼是鍊表?
    順序構造我們都知道怎麼構造,對每個元素持續調用上文代碼定義的 addNode 方法即可(即尾插法),與尾插法對應的,是頭插法,即把每一個元素插到頭節點後面即可,這樣就能做到逆序構造鍊表,如圖示(以插入1,2 為例)
  • 面試官系列 - LeetCode鍊表知識點&題型總結
    分類刷題,我們在力扣上面可以看到,https://leet-cn.com/problemset/algorithms/ ,刷題是可以按標籤來的。比如鍊表,數組,二分查找,二叉樹,動態規劃等學好算法不是一日之功,需要長期的積累。建議的做法是每天做一兩道題,題目不在多,貴在於理解。
  • 鍊表算法面試問題?看我就夠了!
    (2)從頭節點開始,依次遍歷單鍊表的每一個節點。(3)每遍歷到一個新節點,就用新節點和 HashSet 集合當中存儲的節點作比較,如果發現 HashSet 當中存在相同節點 ID,則說明鍊表有環,如果 HashSet 當中不存在相同的節點 ID,就把這個新節點 ID 存入 HashSet ,之後進入下一節點,繼續重複剛才的操作。
  • 《劍指offer》55-鍊表中環的入口【Java+Python】
    題目描述 給一個鍊表,若其中包含環,請找出該鍊表的環的入口結點,否則,輸出null。2. 示例 無3. 解題思路 方法1.= head){            low = low.next;            head = head.next;        }        return low;     }}5.
  • 深入理解Linux內核鍊表
    #一、 鍊表數據結構簡介鍊表是一種常用的組織有序數據的數據結構,它通過指針將一系列數據節點連接成一條數據鏈,是線性表的一種重要實現方式。如果打亂前驅、後繼的依賴關係,就可以構成"二叉樹";如果再讓首節點的前驅指向鍊表尾節點、尾節點的後繼指向首節點(如圖2中虛線部分),就構成了循環鍊表;如果設計更多的指針域,就可以構成各種複雜的樹狀數據結構。##3. 循環鍊表循環鍊表的特點是尾節點的後繼指向首節點。
  • Python|Leetcode鍊表系列(上篇)
    self.tail.next = node #tail為尾節點,在尾節點添加新節點,尾節點的指針域 self.tail = node #指向下一節點,這時新的尾節點就是node節點定義類方法,實現遍歷鍊表元素。
  • ​LeetCode刷題實戰148:排序鍊表
    今天和大家聊的問題叫做 排序鍊表,我們先來看題面:https://leetcode-cn.com/problems/sort-list/Given the head of a linked list, return the list after sorting it in ascending order.
  • 拿到騰訊字節快手offer後,他的LeetCode刷題經驗在GitHub上收穫1.3...
    一位Java研發工程師分享了一個名為「LeetCode題目分類與面試問題整理」,一時間獲得1300星。這篇筆記的作者叫袁廣鑫,面試三十多家網際網路公司親歷整理,曾拿到字節、騰訊、滴滴offer,目前在快手擔任Java工程師。LeetCode有哪些題目是由作者欽點,是最最常考的題目呢?
  • 一文搞懂《鍊表反轉》
    題目描述給你一個鍊表,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊表。k 是一個正整數,它的值小於或等於鍊表的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。思路我們的思路還是一樣的,我們把每 k 位的位置當成是尾節點即可。我們的任務就是每次反轉頭尾之間的所有節點,然後將鍊表重新拼起來即可。我們先來寫一下反轉頭尾之間的所有節點這個方法。
  • 算法一看就懂之「 數組與鍊表 」
    但別人封裝好了不代表我們就可以不關注了,數據結構作為程式設計師的內功心法,是非常值得我們多花時間去研究的,我這就翻開書複習複習:本文就先從大家最經常使用的「 數組 」和「 鍊表 」聊起。不過在聊數組和鍊表之前,咱們先看一下數據的邏輯結構分類。通俗的講,數據的邏輯結構主要分為兩種:知道了分類,下面我們來詳細看一下「 數組 」和「 鍊表 」的原理。
  • 一口氣搞懂「鍊表」,就靠這20+張圖了
    該方法是將新結點逐個插入到當前鍊表的表尾上,為此必須增加一個尾指針r, 使其始終指向當前鍊表的尾結點,代碼如下://尾插法建立單鍊表LinkedList LinkedListCreatT() {    Node *L;    L = (Node *)malloc(sizeof(Node